採用nginx+php做爲webserver的架構模式,在現現在運用至關普遍。然而第一步須要實現的是如何讓nginx正確的調用php。因爲nginx調用php並非如同調用一個靜態文件那麼直接簡單,是須要動態執行php腳本。因此涉及到了對nginx.conf文件的配置。這一步對新手而言通常須要網上查資料,對於通常的熟手而言,也有很多同窗並無搞透徹爲什麼要如此這般配置。本文的主要內容爲如何在nginx server中正確配置php調用方法,以及配置的基本原理。
Nginx的配置文件默認位置爲:/etc/nginx/nginx.conf
php
在個人環境中 nginx.conf
在 /etc/nginx/nginx.conf
html
使用vim打開文件nginx.confnode
vim /etc/nginx/nginx.conf
# nginx運行的用戶名 user nginx; # nginx啓動進程,一般設置成和cpu的數量相等,這裏爲自動 worker_processes auto; # errorlog文件位置 error_log /var/log/nginx/error.log; # pid文件地址,記錄了nginx的pid,方便進程管理 pid /run/nginx.pid; # Load dynamic modules. See /usr/share/nginx/README.dynamic. # 用來加載其餘動態模塊的配置 include /usr/share/nginx/modules/*.conf; # 工做模式和鏈接數上限 events { # 每一個worker_processes的最大併發連接數 # 併發總數:worker_processes*worker_connections worker_connections 1024; } # 與提供http服務相關的一些配置參數相似的還有mail http { # 設置日誌的格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # access_log記錄訪問的用戶、頁面、瀏覽器、ip和其餘的訪問信息 access_log /var/log/nginx/access.log main; # 這部分下面會單獨解釋 # 設置nginx是否使用sendfile函數輸出文件 sendfile on; # 數據包最大時發包(使用Nagle算法) tcp_nopush on; # 馬上發送數據包(禁用Nagle算法) tcp_nodelay on; # 連接超時時間 keepalive_timeout 65; # 這個我也不清楚... types_hash_max_size 2048; # 引入文件擴展名與文件類型映射表 include /etc/nginx/mime.types; # 默認文件類型 default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; # http服務上支持若干虛擬主機。 # 每一個虛擬主機一個對應的server配置項 # 配置項裏面包含該虛擬主機相關的配置。 server { # 端口 listen 80 default_server; listen [::]:80 default_server; # 訪問的域名 server_name _; # 默認網站根目錄(www目錄) root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; # 默認請求 location / { } # 錯誤頁(404) error_page 404 /404.html; location = /40x.html { } # 錯誤頁(50X) error_page 500 502 503 504 /50x.html; location = /50x.html { } } }
一、關於error_log 能夠設置log的類型(記錄什麼級別的信息)有:debug、info、notice、warn、error、crit幾種nginx
二、關於sendfile
通常的網絡傳輸過程
硬盤 >> kernel buffer >> user buffer>> kernel socket buffer >>協議棧
使用sendfile後
硬盤 >> kernel buffer (快速拷貝到kernelsocket buffer) >>協議棧
能夠顯著提升傳輸性能。web
三、tcp_nopush和tcp_nodelay
tcp_nopush只有在啓用了sendfile時才起做用,
在啓用tcp_nopush後,程序接收到了數據包後不會立刻發出,而是等待數據包最大時一次性發出,能夠緩解網絡擁堵。(Nagle化)
相反tcp_nodelay則是當即發出數據包.算法
分析完了配置文件後開始配置環境。vim
由於只是配置PHP的服務器,並且只使用一個端口因此只須要改動server部分瀏覽器
在vim中點擊‘i’進入編輯模式服務器
server { listen 80 default_server; listen [::]:80 default_server; # 這裏改動了,也能夠寫你的域名 server_name 192.168.17.26; # 默認網站根目錄(www目錄) root /var/www/; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { # 這裏改動了 定義首頁索引文件的名稱 index index.php index.html index.htm; } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } # 這裏新加的 # PHP 腳本請求所有轉發到 FastCGI處理. 使用FastCGI協議默認配置. # Fastcgi服務器和程序(PHP,Python)溝通的協議. location ~ \.php$ { # 設置監聽端口 fastcgi_pass 127.0.0.1:9000; # 設置nginx的默認首頁文件(上面已經設置過了,能夠刪除) fastcgi_index index.php; # 設置腳本文件請求的路徑 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 引入fastcgi的配置文件 include fastcgi_params; } }
修改完成後將vim編輯器切換到通常一半模式(Esc),而後輸入:wq保存退出。網絡
以後重啓Nginx服務
service nginx restart
以上就配置成功了,可是上面的配置只是nginx配置部分,更多的內容須要繼續學習。
咱們能夠經過下面的方法判斷Nginx配置是否成功。
在Nginx的網站根目錄(/var/www/)下建立一個php文件,隨便起名個人是php_info.php
內容以下:
<?php // 順即可以看一下php的擴展全不全 phpinfo();
進入你的網站看看能不能打開文件
你的ip/文件名 例如:192.168.17.26/php_info.php
ok,咱們能夠看到配置成功了。
上邊咱們已經配置成功了,如今咱們來看下具體的原理。
首先簡單的講一講原理,目前主流的nginx+php的運行原理以下:
一、nginx的worker進程
直接管理每個請求到nginx的網絡請求。
二、對於php而言,因爲在整個網絡請求的過程當中php是一個cgi程序的角色,因此採用名爲php-fpm的進程管理程序
來對這些被請求的php程序進行管理。php-fpm程序也如同nginx同樣,須要監聽端口,而且有master和worker進程。worker進程直接管理每個php進程。
三、關於fastcgi:fastcgi是一種進程管理器,管理cgi進程。市面上有多種實現了fastcgi功能的進程管理器,php-fpm就是其中的一種。再提一點,php-fpm做爲一種fast-cgi進程管理服務,會監聽端口,通常默認監聽9000端口,而且是監聽本機
,也就是隻接收來自本機的端口請求,因此咱們一般輸入命令 netstat -nlpt|grep php-fpm 會獲得:
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1057/php-fpm
這裏的127.0.0.1:9000 就是監聽本機9000端口的意思。
四、關於fastcgi的配置文件,目前fastcgi的配置文件通常放在nginx.conf同級目錄下,配置文件形式,通常有兩種:fastcgi.conf 和 fastcgi_params。不一樣的nginx版本會有不一樣的配置文件,這兩個配置文件有一個很是重要的區別:fastcgi_parames文件中缺乏下列配置:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
咱們能夠打開fastcgi_parames文件加上上述行,也能夠在要使用配置的地方動態添加。使得該配置生效。
五、當須要處理php請求時,nginx的worker進程會將請求移交給php-fpm的worker進程進行處理,也就是最開頭所說的nginx調用了php,其實嚴格得講是nginx間接調用php
。
瞭解了上面的這五個簡單原理,在nginx中配置php調用方法就變得易如反掌。
配置文件詳解:
server { listen 8011; server_name test.cn; location ~ \.php?.*$ { root /share/test; fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
一、第一個大括號 server{ }:沒必要多說,表明一個獨立的server,
二、listen 8011:表明該server監聽8011端口
三、location ~ .php?.*${ }:表明一個能匹配對應uri的location,用於匹配一類uri,並對所匹配的uri請求作自定義的邏輯、配置。這裏的location,匹配了全部帶.php的uri請求,例如:http://192.168.244.128:8011/test.php/asdasd http://192.168.244.128:8011/index.php等
四、root /share/test:請求資源根目錄,告訴匹配到該location下的uri到/share/teset文件夾下去尋找同名資源。
五、fastcgi_pass 127.0.0.1:9000:這行開始是本文的重點:這行代碼的意思是,將進入到該location內的uri請求看作是cgi程序,並將請求發送到9000端口,交由php-fpm處理。
六、fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; :這行配置意思是:動態添加了一行fastcgi配置,配置內容爲SCRIPT_FILENAME,告知管理進程,cgi腳本名稱。因爲個人nginx中只有fastcgi_params文件,沒有fastcgi.conf文件,因此要使php-fpm知道SCRIPT_FILENAME的具體值,就必需要動態的添加這行配置。
七、include fastcgi_params; 引入fastcgi配置文件
以上就是最簡潔版的nginx啓動php腳本的最簡配置,當重啓nginx以後,在/share/test目錄下建立一個xx.php文件,輸入<?php echo "hello world"; ?>保存,而後在瀏覽器中訪問localhost:8011/xx.php 就能夠在網頁上顯示hello world了。
外網IP:http://58.62.21.107:8382 映射內網服務器IP 192.168.17.56 的 82 端口,即:192.168.17.56:82,須要在nginx.conf
配置文件中開放 82 端口給 外網訪問,即下面的配置:
[root@ceshi www]# cat /etc/nginx/nginx.conf # For more information on configuration, see: # * Official English Documentation: http://nginx.org/en/docs/ # * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; # Load dynamic modules. See /usr/share/nginx/README.dynamic. include /usr/share/nginx/modules/*.conf; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server { listen 82 default_server; # 服務器端口,和外網映射的需保持一致 listen [::]:82 default_server; # 服務器端口,和外網映射的需保持一致 server_name 192.168.17.56; root /data/www/; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } # PHP 腳本請求所有轉發到 FastCGI處理. 使用FastCGI協議默認配置. # Fastcgi服務器和程序(PHP,Python)溝通的協議. location ~ \.php$ { # 設置監聽端口 fastcgi_pass 127.0.0.1:9000; # 設置nginx的默認首頁文件(上面已經設置過了,能夠刪除) fastcgi_index index.php; # 設置腳本文件請求的路徑 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 引入fastcgi的配置文件 include fastcgi_params; } } # Settings for a TLS enabled server. # # server { # listen 443 ssl http2 default_server; # listen [::]:443 ssl http2 default_server; # server_name _; # root /usr/share/nginx/html; # # ssl_certificate "/etc/pki/nginx/server.crt"; # ssl_certificate_key "/etc/pki/nginx/private/server.key"; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 10m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # # location / { # } # # error_page 404 /404.html; # location = /40x.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } # } }