centos7下部署nginx與php


背景介紹

相信讀者在看這篇文章之前已經fastcgi,php-fpm有所了解。大概來講php語言需要fastcgi程序,即php解釋器解釋,而php解釋器需要php-fpm管理器進行調度。
以下對CGI、FastCGI、php-fpm之間關系進行通俗解釋(來源於知乎用戶Journey Lin):

講Fastcgi之前需要先講CGI,CGI是為了保證web server傳遞過來的數據是標准格式的,它是一個協議,方便CGI程序的編寫者。Fastcgi是CGI的更高級的一種方式,是用來提高CGI程序性能的。web server(如nginx)只是內容的分發者。比如,如果請求/index.html,那么web server會去文件系統中找到這個文件,發送給瀏覽器,這里分發的是靜態資源。如果現在請求的是/index.php,根據配置文件,nginx知道這個不是靜態文件,需要去找PHP解析器來處理,那么他會把這個請求簡單處理后交給PHP解析器。此時CGI便是規定了要傳什么數據/以什么格式傳輸給php解析器的協議。當web server收到/index.php這個請求后,會啟動對應的CGI程序,這個程序就是PHP的解析器。接下來PHP解析器會解析php.ini文件,初始化執行環境,然后處理請求,再以CGI規定的格式返回處理后的結果,退出進程。web server再把結果返回給瀏覽器。那么CGI相較於Fastcgi而言其性能瓶頸在哪呢?CGI針對每個http請求都是fork一個新進程來進行處理,處理過程包括解析php.ini文件,初始化執行環境等,然后這個進程會把處理完的數據返回給web服務器,最后web服務器把內容發送給用戶,剛才fork的進程也隨之退出。 如果下次用戶還請求動態資源,那么web服務器又再次fork一個新進程,周而復始的進行。而Fastcgi則會先fork一個master,解析配置文件,初始化執行環境,然后再fork多個worker。當請求過來時,master會傳遞給一個worker,然后立即可以接受下一個請求。這樣就避免了重復的勞動,效率自然是高。而且當worker不夠用時,master可以根據配置預先啟動幾個worker等着;當然空閑worker太多時,也會停掉一些,這樣就提高了性能,也節約了資源。這就是Fastcgi的對進程的管理。大多數Fastcgi實現都會維護一個進程池。注:swoole作為httpserver,實際上也是類似這樣的工作方式。
那PHP-FPM又是什么呢?它是一個實現了Fastcgi協議的程序,用來管理Fastcgi起的進程的,即能夠調度php-cgi進程的程序。現已在PHP內核中就集成了PHP-FPM,使用--enalbe-fpm這個編譯參數即可。另外,修改了php.ini配置文件后,沒辦法平滑重啟,需要重啟php-fpm才可。此時新fork的worker會用新的配置,已經存在的worker繼續處理完手上的活。

在php5.3.3之前 php-fpm以補丁包的形式存在,而5.3.3 以后將其整合到了php,只消編譯安裝時帶上--enable-fpm 開啟該功能。

yum 安裝

安裝nginx

sudo yum -y install nginx    

啟動nginx,在本機瀏覽器訪問nginx頁面,檢查服務是否啟動成功

sudo systemctl start  nginx
訪問url:http://ip:80 

安裝php與php-fpm

sudo yum -y install php php-fpm

啟動php-fpm服務

sudo systemctl start php-fpm

在nginx.conf中添加php的配置

在其http{}的server{}中 root /usr/share/nginx/html行下添加:

sudo  vim /etc/nginx/nginx.conf
    index        index.html index.htm index.php;
    location ~ \.php$ {
       fastcgi_pass   127.0.0.1:9000;           #fastcgi服務端口,將http請求代理到此端口
       fastcgi_index  index.php;                    #fastcgi服務默認頁面
       fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;    #設置請求的腳本文件路徑
       include        fastcgi_params;        
   }

檢查nginx配置,並重新加載配置

nginx -t
sudo systemctl reload  nginx

測試是否能解析php頁面

sudo vim /usr/share/nginx/html/info.php
<?php
    phpinfo();
?>

在本機瀏覽器訪問以上頁面 http://ip:80/info.php

編譯安裝

安裝前准備

安裝一些編譯工具和依賴包等

sudo yum -y install gcc automake autoconf libtool make unzip gcc-c++ glibc gd-devel
sudo yum -y install libmcrypt-devel mhash-devel libxslt-devel \
libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel \
zlib zlib-devel  glibc-devel glib2 glib2-devel bzip2 bzip2-devel \
ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel \
krb5 krb5-devel libidn libidn-devel openssl openssl-devel

安裝nginx

下載官方軟件包

wget http://nginx.org/download/nginx-1.4.2.tar.gz

解壓

tar -xvf nginx-1.4.2.tar.gz 

創建安裝目錄

sudo mkdir /usr/local/nginx

編譯安裝

cd nginx-1.4.2
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx  --conf-path=/usr/local/nginx/conf/nginx.conf --user=nginx --group=nginx
 sudo make && sudo make install

起服務

cd /usr/local/nginx/sbin/
sudo ./nginx

出現 make[1]: Leaving directory `/home/xxx/nginx-1.4.2',不用管。

安裝php

下載官方軟件包

wget http://cn2.php.net/distributions/php-5.6.39.tar.gz

解壓

tar -xvf php-5.6.39.tar.gz 

創建安裝目錄

sudo mkdir /usr/local/php

編譯安裝

./configure --prefix=/usr/local/php  \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm --with-mcrypt \
--enable-mbstring --disable-pdo --with-curl --disable-debug  --disable-rpath \
--enable-inline-optimization --with-bz2  --with-zlib --enable-sockets \
--enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex \
--with-mhash --enable-zip --with-pcre-regex --with-mysql --with-mysqli \
--with-gd --with-jpeg-dir
sudo make all install

進行php-fpm的用戶設置

sudo groupadd www
sudo useradd www -g www -s /sbin/nologin
cd /usr/local/php
sudo cp etc/php-fpm.conf.default etc/php-fpm.conf
sudo vi etc/php-fpm.conf   #修改以下兩個參數
user = www
group = www

起服務

sudo  /usr/local/php/sbin/php-fpm    

在nginx.conf進行php的為配置

在http{}的server{}里添加

 vim /usr/local/nginx/conf/nginx.conf
    index        index.html index.htm index.php;
    location ~ \.php$ {
             fastcgi_pass   127.0.0.1:9000;           #fastcgi服務端口,將http請求代理到此端口
             fastcgi_index  index.php;                    #fastcgi服務默認頁面
             fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;    #設置請求的腳本文件路徑
             include        fastcgi_params;
             }

添加php測試頁面

vim  /usr/local/nginx/html/index.php
<?php
    phpinfo();
?>    

重啟nginx服務

cd /usr/local/nginx/sbin/
sudo ./nginx

測試:在本機上訪問該頁面

http://ip:80/index.php


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM