Nginx和PHP的配置

採用nginx+php做爲webserver的架構模式,在現現在運用至關普遍。然而第一步須要實現的是如何讓nginx正確的調用php。因爲nginx調用php並非如同調用一個靜態文件那麼直接簡單,是須要動態執行php腳本。因此涉及到了對nginx.conf文件的配置。這一步對新手而言通常須要網上查資料,對於通常的熟手而言,也有很多同窗並無搞透徹爲什麼要如此這般配置。本文的主要內容爲如何在nginx server中正確配置php調用方法,以及配置的基本原理。

1、nginx配置文件修改

配置文件位置

Nginx的配置文件默認位置爲:/etc/nginx/nginx.confphp

在個人環境中 nginx.conf/etc/nginx/nginx.confhtml

使用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則是當即發出數據包.算法

php fastcgi配置

分析完了配置文件後開始配置環境。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

clipboard.png

ok,咱們能夠看到配置成功了。

2、nginx+php運行原理

上邊咱們已經配置成功了,如今咱們來看下具體的原理。

首先簡單的講一講原理,目前主流的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了。

3、外網訪問內網設置

外網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 {
#        }
#    }

}

參考文章:
Nginx的安裝與配置(PHP)
nginx+php的配置與原理

相關文章
相關標籤/搜索