點擊訪問原文
您還可以加入全棧技術(shù)交流群(QQ群號:254842154)
Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 服務(wù)器,也是一個 IMAP/POP3/SMTP 代理服務(wù)器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發(fā)的。其特點是占有內(nèi)存少,并發(fā)能力強,事實上nginx的并發(fā)能力確實在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)較好,中國大陸使用nginx網(wǎng)站用戶有:新浪、網(wǎng)易、騰訊等。在高連接并發(fā)的情況下,Nginx是Apache服務(wù)器不錯的替代品。
1、安裝
http://nginx.org/ 官網(wǎng)下載。我找了一個穩(wěn)定版本下載。
wget http://nginx.org/download/nginx-1.6.2.tar.gz
tar -zxvf nginx-1.6.2.tar.gz
cd nginx-1.6.2
還需要下載pcre、openssl、zlib,在這里給出下載地址,并解壓,供編譯時使用。注意,不需要編譯他們,只要在nginx的編譯參數(shù)中指定源碼路徑即可。
pcre: https://sourceforge.net/projects/pcre/files/
wget http://sourceforge.net/projects/pcre/files/pcre/8.32/pcre-8.32.tar.gz/download
openssl: http://www.openssl.org/
wget http://www.openssl.org/source/openssl-1.0.1k.tar.gz
zlib: http://zlib.net/
wget http://zlib.net/zlib-1.2.8.tar.gz
編譯
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-pcre --with-openssl=/tmp/openssl-1.0.1k --with-zlib=/tmp/zlib-1.2.8 --with-pcre=/tmp/pcre-8.32
make
make install
2、配置
簡單的配置。通常,不需要任何配置即可訪問。具體的配置請自行網(wǎng)上查詢。
cd /usr/local/nginx/conf
vim nginx.conf
測試nginx的配置文件是否正確
/usr/local/nginx/nginx -t
啟動nginx(確保80端口沒有被暫用,假如服務(wù)器上有apache,關(guān)閉之)
/usr/local/nginx/nginx
看看是否啟動成功(看看80端口是否在監(jiān)聽)
netstat -ano|grep 80
重啟nginx
/usr/local/nginx/nginx -s reload
關(guān)閉nginx
/usr/local/nginx/nginx -s stop
查看nginx的兩個主要線程
ps aux | grep nginx
3、使nginx支持php
假如php的版本小于5.3,需要單獨安裝php-fpm擴展。大于5.3的php集成了php-fpm,只需要在編譯安裝php時,通過 --enable-fpm --enable-fastcgi 這兩個編譯選項來安裝擴展。假如編譯安裝時忘記了打開這兩個編譯選項,應(yīng)該是可以單獨安裝的,但是我試過了不成功,可能是我的方法不對。于是只能重新編譯php,幸好也沒問題。重新編譯前為了保險起見最好備份一下php.ini。
nginx是通過fast-cgi來解析php請求的,默認通過9000端口通信。
安裝好php-fpm后,需要配置一下參數(shù),比較多。配置文件在
/usr/local/php/etc/php-fpm.conf,不同安裝目錄可能不同。
pid = run/php-fpm.pid
#pid設(shè)置,默認在安裝目錄中的var/run/php-fpm.pid,建議開啟
error_log = log/php-fpm.log
#錯誤日志,默認在安裝目錄中的var/log/php-fpm.log
log_level = notice
#錯誤級別. 可用級別為: alert(必須立即處理), error(錯誤情況), warning(警告情況), notice(一般重要信息), debug(調(diào)試信息). 默認: notice.
emergency_restart_threshold = 60
emergency_restart_interval = 60s
#表示在emergency_restart_interval所設(shè)值內(nèi)出現(xiàn)SIGSEGV或者SIGBUS錯誤的php-cgi進程數(shù)如果超過 emergency_restart_threshold個,php-fpm就會優(yōu)雅重啟。這兩個選項一般保持默認值。
process_control_timeout = 0
#設(shè)置子進程接受主進程復(fù)用信號的超時時間. 可用單位: s(秒), m(分), h(小時), 或者 d(天) 默認單位: s(秒). 默認值: 0.
daemonize = yes
#后臺執(zhí)行fpm,默認值為yes,如果為了調(diào)試可以改為no。在FPM中,可以使用不同的設(shè)置來運行多個進程池。 這些設(shè)置可以針對每個進程池單獨設(shè)置。
listen = 127.0.0.1:9000
#fpm監(jiān)聽端口,即nginx中php處理的地址,一般默認值即可。可用格式為: 'ip:port', 'port', '/path/to/unix/socket'. 每個進程池都需要設(shè)置.
listen.backlog = -1
#backlog數(shù),-1表示無限制,由操作系統(tǒng)決定,此行注釋掉就行。backlog含義參考:http://www.3gyou.cc/?p=41
listen.allowed_clients = 127.0.0.1
#允許訪問FastCGI進程的IP,設(shè)置any為不限制IP,如果要設(shè)置其他主機的nginx也能訪問這臺FPM進程,listen處要設(shè)置成本地可被訪問的IP。默認值是any。每個地址是用逗號分隔. 如果沒有設(shè)置或者為空,則允許任何服務(wù)器請求連接
listen.owner = www
listen.group = www
listen.mode = 0666
#unix socket設(shè)置選項,如果使用tcp方式訪問,這里注釋即可。
user = www
group = www
#啟動進程的帳戶和組
pm = dynamic #對于專用服務(wù)器,pm可以設(shè)置為static。
#如何控制子進程,選項有static和dynamic。如果選擇static,則由pm.max_children指定固定的子進程數(shù)。如果選擇dynamic,則由下開參數(shù)決定:
pm.max_children #,子進程最大數(shù)
pm.start_servers #,啟動時的進程數(shù)
pm.min_spare_servers #,保證空閑進程數(shù)最小值,如果空閑進程小于此值,則創(chuàng)建新的子進程
pm.max_spare_servers #,保證空閑進程數(shù)最大值,如果空閑進程大于此值,此進行清理
pm.max_requests = 1000
#設(shè)置每個子進程重生之前服務(wù)的請求數(shù). 對于可能存在內(nèi)存泄漏的第三方模塊來說是非常有用的. 如果設(shè)置為 '0' 則一直接受請求. 等同于 PHP_FCGI_MAX_REQUESTS 環(huán)境變量. 默認值: 0.
pm.status_path = /status
#FPM狀態(tài)頁面的網(wǎng)址. 如果沒有設(shè)置, 則無法訪問狀態(tài)頁面. 默認值: none. munin監(jiān)控會使用到
ping.path = /ping
#FPM監(jiān)控頁面的ping網(wǎng)址. 如果沒有設(shè)置, 則無法訪問ping頁面. 該頁面用于外部檢測FPM是否存活并且可以響應(yīng)請求. 請注意必須以斜線開頭 (/)。
ping.response = pong
#用于定義ping請求的返回相應(yīng). 返回為 HTTP 200 的 text/plain 格式文本. 默認值: pong.
request_terminate_timeout = 0
#設(shè)置單個請求的超時中止時間. 該選項可能會對php.ini設(shè)置中的'max_execution_time'因為某些特殊原因沒有中止運行的腳本有用. 設(shè)置為 '0' 表示 'Off'.當(dāng)經(jīng)常出現(xiàn)502錯誤時可以嘗試更改此選項。
request_slowlog_timeout = 10s
#當(dāng)一個請求該設(shè)置的超時時間后,就會將對應(yīng)的PHP調(diào)用堆棧信息完整寫入到慢日志中. 設(shè)置為 '0' 表示 'Off'
slowlog = log/$pool.log.slow
#慢請求的記錄日志,配合request_slowlog_timeout使用
rlimit_files = 1024
#設(shè)置文件打開描述符的rlimit限制. 默認值: 系統(tǒng)定義值默認可打開句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。
rlimit_core = 0
#設(shè)置核心rlimit最大限制值. 可用值: 'unlimited' 、0或者正整數(shù). 默認值: 系統(tǒng)定義值.
chroot =
#啟動時的Chroot目錄. 所定義的目錄需要是絕對路徑. 如果沒有設(shè)置, 則chroot不被使用.
chdir =
#設(shè)置啟動目錄,啟動時會自動Chdir到該目錄. 所定義的目錄需要是絕對路徑. 默認值: 當(dāng)前目錄,或者/目錄(chroot時)
catch_workers_output = yes
#重定向運行過程中的stdout和stderr到主要的錯誤日志文件中. 如果沒有設(shè)置, stdout 和 stderr 將會根據(jù)FastCGI的規(guī)則被重定向到 /dev/null . 默認值: 空.
設(shè)置好后,測試一下配置文件
/usr/local/php/sbin/php-fpm
啟動
/usr/local/php/sbin/php-fpm
看看是否啟動成功了
ps aux | grep php-fpm
我的機器顯示如下
[root@hellojammy html]# ps aux | grep php-fpm
root 1643 0.0 1.0 104272 5464 ? Ss 22:49 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
nobody 1644 0.0 1.1 104272 6164 ? S 22:49 0:00 php-fpm: pool www
nobody 1645 0.0 1.2 104272 6600 ? S 22:49 0:00 php-fpm: pool www
root 1651 0.0 0.1 6384 684 pts/1 S+ 22:53 0:00 grep php-fpm
或者查看9000端口是否已經(jīng)正在被監(jiān)聽
netstat -lnp | grep :9000
我的機器上顯示如下
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 1643/php-fpm
再配置nginx的配置文件,使其php支持,
vim /usr/local/nginx/nginx.conf
配置
location ~ \\.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
需要在Server節(jié)點下指定網(wǎng)站根目錄
root /usr/local/apache/htdocs
添加ghost站點,反向代理
####ghost博客配置####
server {
listen 80;
server_name www.hello1010.com hello1010.com;
access_log logs/ghost.access.log;
location / {
root /usr/local/apache/htdocs/ghost;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass_header User-Agent; #獲取客戶端User-Agent來判斷每次POST數(shù)據(jù)是否跟第一次請求來自同1個瀏覽器
proxy_pass http://127.0.0.1:2386;
proxy_redirect off;
}
}
添加其他站點
####靜態(tài)文件####
server {
listen 80;
server_name static.hello1010.com;
root /usr/local/nginx/html/static;
}
最后別忘接了重啟nginx。