Linux上配置Nginx+PHP5(FastCGI)
原為地址:http://www.laruence.com/2009/07/28/1030.html
Nginx是俄羅斯人編寫的十分輕量級的HTTP伺服器,以事件驅動的方式編寫,所以有非常好的效能,同時也是一個非常高效的反向代理、負載平衡。其擁有匹配Lighttpd的效能,同時還沒有Lighttpd的記憶體洩漏問題,而且Lighttpd的mod_proxy也有一些問題並且很久沒有更新。
因此我打算用其替代Apache應用於Linux伺服器上。但是Nginx並不支援cgi方式執行,原因是可以減少因此帶來的一些程式上的漏洞。那麼我們必須使用FastCGI方式來執行PHP程式。
下面是我成功地配置Nginx + PHP5 FastCGI的過程
首先安裝或編譯Nginx
安裝Nginx
原始碼包可以在官方主頁上下載。Ubuntu 7.10可以直接通過apt安裝,也可以從這裡下載最新的deb包:
- sudo apt-get install nginx
如果要自己編譯的話,需要確保自己已經有編譯器和PCRE的庫(用於Nginx的rewrite模組,如果不需要這個模組可以在configure時使用./configure –without-rewrite),編譯方法如下:
- wget http://sysoev.ru/nginx/nginx-0.5.34.tar.gz
- tar zxvf nginx-0.5.34.tar.gz
- cd nginx-0.5.34
- ./configure #預設配置安裝路徑為/usr/local/nginx 可以追加–prefix=/usr設定到/usr
- make && make install # install要求有root許可權
Ubuntu安裝之後的檔案結構大致為:
所有的配置檔案都在/etc/nginx下,並且每個虛擬主機已經安排在了/etc/nginx/sites-available下
程式檔案在/usr/sbin/nginx
日誌放在了/var/log/nginx中
並已經在/etc/init.d/下建立了啟動指令碼nginx
預設的虛擬主機的目錄設定在了/var/www/nginx-default
而自己利用預設配置編譯的,則放在/usr/local/nginx下,以下是目錄結構:
- /usr/local/nginx/conf 配置目錄
- /usr/local/nginx/html 預設的網站根目錄
- /usr/local/nginx/logs 日誌和pid檔案目錄
- /usr/local/nginx/sbin 執行檔案目錄
下面可以啟動nginx來看看效果(請確保80埠沒有其他服務在使用):
Ubuntu請執行:
- sudo /etc/init.d/nginx start
其他請執行:
- /usr/local/nginx/sbin/nginx
然後就可以通過http://localhost/來看看效果了。
要配置nginx的自動執行,可以將/usr/local/nginx/sbin/nginx新增到/etc/rc.local中,Ubuntu可以執行
- update-rc.d nginx defaults
安裝PHP5
至於如何在Linux上安裝PHP,有很多文章,甚至很多平臺上都有現成的軟體包,無需自己編譯。
PHP5的CGI方式的一大優勢是內建了FastCGI的支援,只需指明繫結的地址和埠引數便可以以FastCGI的方式執行,如下:
php-cgi -b 127.0.0.1:9000
如何配置其與nginx一起執行呢?
配置Nginx的PHP FastCGI
請將以下內容儲存為fastcgi_params檔案,儲存於/usr/local/nginx/conf下(Ubuntu可儲存於/etc/nginx下),他為我們的FastCGI模組設定了基本的環境變數:
- #fastcgi_params
- fastcgi_param GATEWAY_INTERFACE CGI/1.1;
- fastcgi_param SERVER_SOFTWARE nginx;
- 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_FILENAME $document_root$fastcgi_script_name;
- 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 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;
- # PHP only, required if PHP was built with –enable-force-cgi-redirect
- fastcgi_param REDIRECT_STATUS 200;
請特別注意”fastcgi_script_name”一行,PHP-CGI特別需要此行資訊來確定PHP檔案的位置。
另外需要在PHP-CGI的配置檔案(Ubuntu 上此配置檔案位於/etc/php5/cgi/php.ini)中,開啟cgi.fix_pathinfo選項:
- cgi.fix_pathinfo=1;
這樣php-cgi方能正常使用SCRIPT_FILENAME這個變數。
接下來在nginx的配置中針對php檔案配置其利用FastCGI程式來執行:
- server {
- index index.php;
- root /usr/local/nginx/html;
- location ~ .*.php$ {
- include /usr/local/nginx/conf/fastcgi_params; #請根據自己儲存的路徑進行設定
- fastcgi_index index.php;
- fastcgi_pass 127.0.0.1:9000; #請根據自己的FastCGI繫結的地址和埠進行配置
- }
- }
通知Nginx重新載入配置:
- kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
Ubuntu使用者可以使用init指令碼:sudo /etc/init.d/nginx reload
然後啟動php-cgi -b 127.0.0.1:9000
假設你在文件根目錄放了index.php,幷包含”phpinfo();”的內容,現在再看http://localhost/index.php便應該能看到php的除錯資訊了。
配置php程式
直接使用php-cgi的FastCGI執行方式有兩個問題(貌似應該有解決方案,如果知道的話可以教教我):
- 1.如果程式崩潰,難以配置重新啟動
- 2.單程式的效率低
因此,我們可以利用Lighttpd的spawn-fcgi來控制程式的執行。獲得spawn-fcgi的方法如下:
- wget http://www.lighttpd.net/download/lighttpd-1.4.18.tar.bz2 #獲取Lighttpd的原始碼包
- tar -xvjf lighttpd-1.4.18.tar.bz2
- cd lighttpd-1.4.18
- ./configure #編譯
- make
- cp src/spawn-fcgi /usr/local/bin/spawn-fcgi #取出spawn-fcgi的程式
下面我們就可以使用 spawn-fcgi 來控制php-cgi的FastCGI程式了
- /usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-cgi
引數含義如下
- -f <fcgiapp> 指定呼叫FastCGI的程式的執行程式位置,根據系統上所裝的PHP的情況具體設定
- -a <addr> 繫結到地址addr
- -p <port> 繫結到埠port
- -s <path> 繫結到unix socket的路徑path
- -C <childs> 指定產生的FastCGI的程式數,預設為5(僅用於PHP)
- -P <path> 指定產生的程式的PID檔案路徑
- -u和-g FastCGI使用什麼身份(-u 使用者 -g 使用者組)執行,Ubuntu下可以使用www-data,其他的根據情況配置,如nobody、apache等
然後我們可以將這行程式碼加入到/etc/rc.local檔案底部,這樣系統啟動的時候也可以同時啟動PHP的FastCGI程式。
相關文章
- Nginx 配置 fastcgi cacheNginxAST
- Nginx配置fastcgi cacheNginxAST
- FastCGI 程式管理器(FPM)-配置AST
- Linux 上配置 SQL Server Always On Availability GroupLinuxSQLServerAI
- CGI與FastCGIAST
- CGI和FastCGIAST
- Linux上的redis的安裝和配置LinuxRedis
- 實戰Nginx與PHP(FastCGI)的安裝、配置與最佳化NginxPHPAST
- 在 Linux 上配置一個 syslog 伺服器Linux伺服器
- Linux系統上配置redis開機自啟LinuxRedis
- 如何在 Debian Linux 上設定和配置網橋Linux
- 如何在Linux上檢視和配置密碼時效Linux密碼
- 在 Linux 上把 Vim 配置為預設編輯器Linux
- Linux虛擬機器安裝配置到專案上架Linux虛擬機
- 【配置上線】Linux克隆安裝Oracle資料庫軟體LinuxOracle資料庫
- CGI / FASTCGI已停止工作 彩蛋?AST
- 寫了一個 FastCGI 實現AST
- ubuntu linux配置UbuntuLinux
- linux配置sftpLinuxFTP
- linux 配置hostnameLinux
- linux配置jdkLinuxJDK
- 11. Oracle for Linux安裝和配置——11.2. Linux安裝和配置——11.2.5. Linux配置OracleLinux
- 將java專案打包部署在linux系統上(配置成systemd)JavaLinux
- 圖解如何在Linux上配置git自動登入驗證圖解LinuxGit
- 解釋nginx.conf.default 中關於fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;NginxAST
- FastCGI sent in stderr: "Primary script unknown" 報錯AST
- 淺談PHP fastcgi和php-fpmPHPAST
- Nginx、fastCGI、php-fpm關係梳理NginxASTPHP
- Linux基礎配置Linux
- linux下配置javaLinuxJava
- Linux環境配置Linux
- linux網路配置Linux
- Linux配置軟路由Linux路由
- Linux配置防火牆Linux防火牆
- linux 配置 bond 介面Linux
- Linux|網路配置Linux
- Linux centos7上gitlab伺服器的搭建,本地配置和使用LinuxCentOSGitlab伺服器
- 如何在 Linux 上安裝、配置 NTP 伺服器和客戶端?Linux伺服器客戶端
- 【Linux】(小白向)詳解VirtualBox網路配置-配置Linux網路Linux