nginx下部署php項(xiàng)目的方法:1、安裝完畢nginx和php-fpm;2、找到nginx服務(wù)器的配置文件;3、指定php項(xiàng)目的部署位置;4、把配置好的各種server conf放在sites-enabled里即可。
nginx服務(wù)器上部署php項(xiàng)目
nginx本身不能處理PHP頁(yè)面,它只是個(gè)web服務(wù)器,當(dāng)接收到請(qǐng)求后,如果是PHP請(qǐng)求,通過(guò)反向代理的方式轉(zhuǎn)發(fā)給PHP解釋器處理,并把結(jié)果返回給客戶端。因此需要在服務(wù)器上安裝nginx和php-fpm或其他php解釋器。
安裝完畢nginx和php-fpm后,找到nginx服務(wù)器的配置文件
[root@test24266conf]# ps -ef | grep nginx.conf root 31441 1 0 2018 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c/usr/local/nginx/conf/nginx.conf
在這個(gè)文件中,指定php項(xiàng)目的部署位置,即修改server字段下root 指定的文件根目錄。
很多發(fā)型版本,在nginx.conf并沒(méi)有server字段,這是為了管理方便,某些發(fā)行版的預(yù)編譯版本里,nginx.conf 中 http 段最后會(huì)有兩句 include conf.d/*.conf; include sites-enabled/*或只有一條include
sites-enabled/*.conf; 這樣你就可以把已經(jīng)配置好的各種 server conf 放在sites-enabled 里,如
[root@test24266conf]# ll sites-enabled/ -rw-r--r--1 root root 603 103 2017 captcha443.conf -rw-r--r--1 root root 287 9 1 2017 commrisk.conf -rw-r--r--1 root root 194 129 2016 imagerotate.conf -rw-r--r--1 root root 402 9 2 2016 msgqapi.conf -rw-r--r--1 root root 295 102 2017 pointriskapi.conf -rw-r--r--1 root root 290 6 2 2017 risktrade.conf -rw-r--r--1 root root 309 814 2017 rotateapi.conf -rw-r--r--1 root root 313 100 2016 watchdog.conf [root@test24266conf]# 這樣每個(gè).conf文件就可以對(duì)應(yīng)一個(gè)虛擬主機(jī),查看某個(gè)配置文件,如 [root@test24266conf]# cat sites-enabled/pointriskapi.conf server{ listen 8013; server_name point.risk.api; index index.php; #默認(rèn)訪問(wèn)的文件 root /var/www/pointriskapi/hosts; access_log on;
#當(dāng)請(qǐng)求網(wǎng)站下php文件的時(shí)候,反向代理到php-fpm location ~ .*\.php?$ { include fastcgi.conf; } location = /favicon.ico { log_not_found off; access_log off; } } [root@test24266conf]#
我們將php項(xiàng)目文件放入這個(gè)/var/www/pointriskapi/hosts路徑下,如
[root@test24266hosts]# ll -rw-r--r-- 1 apache apache 339 102 2017risk_point.php [root@test24266hosts]# pwd /var/www/pointriskapi/hosts
一般不需要重啟Nginx和php-fpm。現(xiàn)在在客戶端就可以訪問(wèn)http://ip:8013/risk_point.php了。
那么nginx是怎么通過(guò)反向代理的方式將請(qǐng)求轉(zhuǎn)發(fā)給PHP解釋器呢?我們注意到server字段中有一段
location ~ .*\.php?$ { include fastcgi.conf; #加載nginx的fastcgi模塊 }
該段指明了.php文件由誰(shuí)處理。我們查看nginx.conf同級(jí)目錄下的factcgi.conf文件,如
[root@test24266 conf]# cat fastcgi.conf fastcgi_pass 127.0.0.1:9000; #fastcgi_pass unix:/tmp/phpcgi.socket; fastcgi_indexindex.php; access_log /var/log/httpd/access_log main; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param HTTPS $https if_not_empty; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # PHPonly, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200; [root@test24266conf]#
Fastcgi_pass指明了fastcgi進(jìn)程監(jiān)聽(tīng)的IP地址和端口,即nginx會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給這個(gè)socket。因此我們需要在php-fpm的配置文件中指明同樣的socket。啟動(dòng)Php-fpm監(jiān)聽(tīng),查看
[root@test24266~]# netstat -anp | grep 9000 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 3719/php-fpm
總結(jié)一下在nginx與php-fpm模式下,完整的請(qǐng)求和應(yīng)答流程是這樣的:
1、客戶端請(qǐng)求服務(wù)器上某個(gè).php文件
2、Nginx發(fā)現(xiàn)是動(dòng)態(tài)資源需要路由到指定根目錄下
3、加載nginx的fast-cgi模塊
4、Fact-cgi監(jiān)聽(tīng)127.0.0.1:9000(默認(rèn)socket)
5、php-fpm接收到請(qǐng)求,啟用worker進(jìn)程處理請(qǐng)求
6、php-fpm處理完請(qǐng)求,返回給nginx
7、nginx將結(jié)果通過(guò)http返回給瀏覽器