此文對於那些對Nginx了解甚多的大牛則沒必要看下去了,反正你懂的!囧~(*^__^*)
對於Nginx是什麼東西我就不說了,請谷歌、百度之......這篇文章是我花了很多時間,通過看書(誰寫的書我都不想提及了,搜索下就有了)、以及藉助Nginx官網和網上很多牛人的的文章、參閱個別專業性較強的論壇(像守住兄和幾個兄弟搞起來的linuxtone)最終整理出來的筆記.鑒於索取和奉獻的理念,如下分享整個適應於初手參閱的Nginx詳細介紹筆記:
1、Nginx介紹
2、Nginx安裝與啟用
3、Nginx的基本配置與優化
4、Nginx與PHP(FastCGI)的安裝、配置與優化
************************************************
一、Nginx介紹:
Nginx是一款高性能的HTTP和反向代理伺服器,能夠選擇高效的epoll(linux2.6內核)、kqueue(freebsd)、eventport(solaris10)作為網路I/O模型,能夠支持高達50000個併發連接數的響應,而內存、CPU等系統資源消耗卻非常低、運行非常穩定.
2008年12月:Nginx市場佔有量為3354329、佔有率為1.80%
1、選擇Nginx的理由
1.1 支持高併發連接
通過top命令可以查看系統負載和CPU使用率
結論:Nginx在反向代理、rewrite規則、穩定性、靜態文件處理、內存消耗等方面都表現出很強的優勢.
二、Nginx安裝與啟用
Nginx伺服器的安裝與配置
http://www.nginx.net/
最新穩定版nginx-1.0.0
linux系統得安裝有GCC編譯器,再者還有autoconf和automake工具用於自動創建功能完善的makefile,Nginx也是用這一工具生成makefile的.
用yum命令安裝GCC和autoconf和automake工具:
yum install gcc gcc-c autoconf automake -y
Nginx的一些模塊需要其他第三方庫的支持,例如gzip模塊需要zlib庫、rewrite模塊需要pcre庫 、ssl功能需要openssl庫等.同樣可以使用Yum安裝這些模塊依賴的庫:
1、安裝Nginx
1.1 安裝Nginx所需要的pcre庫、才得以支持rewrite
tar zxvf pcre-8.02.tar.gz
cd pcre-8.02
./configure
make && make install
1.2 安裝Nginx
tar zxvf nginx-1.0.0.tar.gz
cd nginx-1.0.0
./configure --prefix=/usr/local/nginx --with-http_ssl_module
make && make install
--->
Configuration summary
using system PCRE library
using system OpenSSL library
md5: using OpenSSL library
using system zlib library
2、啟動Nginx
# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
查看進程:
# ps -ef |grep nginx
root 11659 1 0 14:13 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 11660 11659 0 14:13 ? 00:00:00 nginx: worker process
查看埠號:
# netstat -antup |grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 11659/nginx.conf
從上面可以看到Nginx啟用一個主進程和一個子進程,我們可以修改nginx.conf裡頭的
worker_processes是的運行多個子進程.
3、停止Nginx
當Nginx服務啟動起來后,就會在原本空目錄/usr/local/nginx/logs/下自動生成3個文件:
access.log error.log nginx.pid
這裡包含nginx的主進程號:nginx.pid ,我們可以通過如上的ps命令查看、也可以直接cat出來
3.1 從容停止Nginx
kill -QUIT Nginx主進程號
4、重啟Nginx
如果改變了Nginx的主配置文件,想重啟Nginx,可以先檢查Nginx的配置文件是否正確后才發送系統信號給Nginx主進程的方式進行,檢查方法如下:
# /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
只有出現如上OK信息才會載入新的配置文件.
4.1 平滑重啟Nginx
kill -HUP Nginx主進程號
# kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
如果Nginx本身都還沒啟動,平滑重啟可是會報錯的.
5、Nginx的信號控制
TERM,INT 快速關閉
QUIT 從容關閉
HUP 平滑重啟
USR1 重新打開日誌文件、在切割日誌時用途大
USR2 平滑升級可執行程序
WINCH 從容關閉工作進程
三、Nginx的基本配置與優化
看Nginx的主配置文件,可以發現原本的配置文件非常簡練
- # grep -v "#" nginx.conf
- worker_processes 1;
- events {
- worker_connections 1024;
- }
- http {
- include mime.types;
- default_type application/octet-stream;
- sendfile on;
- keepalive_timeout 65;
- server {
- listen 80;
- server_name localhost;
- location / {
- root html;
- index index.html index.htm;
- }
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;
- }
- }
- }
1、配置虛擬主機
1.1、配置基於IP的虛擬主機
添加虛擬網卡:
ifconfig eth0:1 110.65.99.209 broadcast 110.65.99.255 netmask 255.255.252.0 up
route add -host 110.65.99.209 dev eth0:1
ifconfig eth0:2 110.65.99.210 broadcast 110.65.99.255 netmask 255.255.252.0 up
route add -host 110.65.99.210 dev eth0:2
如上命令最好寫進/etc/rc.local中是的系統開機自動創建.
或者直接cp ifcfg-eth0 ifcfg-eth0:1
修改Nginx的主配置文件: /usr/local/nginx/conf/nginx.conf
在原本定義的一個server之後添加如下兩個虛擬主機
- ###############server2################################
- server {
- listen 110.65.99.209:80;
- server_name server2;
- access_log logs/server2.access.log combined;
- location / {
- index index.html index.htm;
- root /usr/local/nginx/server2;
- }
- }
- ###############server3################################
- server {
- listen 110.65.99.210:80;
- server_name server3;
- access_log logs/server3.access.log combined;
- location / {
- index index.html index.htm;
- root /usr/local/nginx/server3;
- }
- }
然後創建目錄server2和server3,並且在各自目錄下創建index.html測試文件
檢查配置文件是否寫正確,然後才平滑重啟Nginx
# /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
# kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
測試:
# links http://110.65.99.209
# links http://110.65.99.210
測試后在/usr/local/nginx/logs目錄下會自動創建Log日誌文件
server2.access.log server3.access.log
# cat server2.access.log
110.65.99.209 - - [21/Apr/2011:22:34:11 0800] "GET / HTTP/1.1" 200 8 "-" "ELinks/0.11.1 (textmode; Linux; 142x38-2)"
# cat server3.access.log
110.65.99.210 - - [21/Apr/2011:22:34:24 0800] "GET / HTTP/1.1" 200 8 "-" "ELinks/0.11.1 (textmode; Linux; 142x38-2)"
1.2、配置基於域名的虛擬主機
接著如上的配置在server3下面添加如下兩個虛擬主機
- ###############server4################################
- server {
- listen 80;
- server_name server4.com;
- access_log logs/server4.access.log combined;
- location / {
- index index.html index.htm;
- root /usr/local/nginx/server4;
- }
- }
- ###############server5################################
- server {
- listen 80;
- server_name server5.com;
- access_log logs/server5.access.log combined;
- location / {
- index index.html index.htm;
- root /usr/local/nginx/server5;
- }
- }
然後創建目錄server4和server5,並且在各自目錄下創建index.html測試文件
檢查配置文件是否寫正確,然後才平滑重啟Nginx
# /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
# kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
為了讓系統直接緩存域名解析,在/etc/hosts後面追加如下內容(110.65.99.208是eth0-IP):
110.65.99.208 server5.com
110.65.99.208 server4.com
2、Nginx的日誌文件配置與切割
如上的日誌文件內容是有一定的指令定義的,在Nginx的主配置文件中是通過
log_format指令來設置日誌格式:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
如上指令的解析:
$remote_addr用戶獲取客戶端的IP地址,但如果前端使用了反向代理,則獲取到的是反向代理伺服器的IP地址
$http_x_forwarded_for"則可以是的反向代理伺服器轉發請求的HTTP頭信息來記錄客戶端IP
$request用於記錄請求的URL和HTTP協議
$time_local用於記錄訪問時間與時區
$status用於記錄請求狀態,成功時狀態為200,頁面找到時狀態為404
$body_bytes_sent用於記錄發送給客戶端的文件主體內容大小
$http_user_agent用於記錄客戶端瀏覽器的相關信息
上面指定好了日誌格式后就要定義日誌存放的路徑了,access_log指令用於指定日誌存放的路徑
如果說不想記錄日誌,則直接
access_log off;
如果使用如下定義的日誌格式存儲日誌,則可以通過
access_log logs/access.log main;
表示採用main的日誌格式,記錄在/usr/local/nginx/logs/access.log文件中
(如果把日誌存儲路徑定義在其他地方,要確保Nginx進程設置的用戶和組對該目錄有讀寫許可權,否則該日誌文件就無法生成了)
對於生產系統下的server,由於巨大的訪問量會導致日誌文件的增加非常快,日誌太大會影響server的效率,同時為了方便對日誌進行分析計算,需要對日誌文件做定時切割,這裡使用按天計算切割.
先前的文檔提及過kill -USR1的作用時重新打開日誌文件,這樣我們就可以先對舊的日誌文件重命名,通過kill -USR1重新生成access.log文件.藉助crontab進行按天切割的計劃任務.
如下通過一個shell腳本進行日誌切割:
- #!/bin/bash
- logs_path1="/usr/local/nginx/oldlog"
- logs_path2="/usr/local/nginx/logs"
- mkdir -p $logs_path1
- time=`date %Y%m%d`
- mv ${logs_path2}/access.log ${logs_path1}/$time.access.log
- kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
- 通過crontab計劃任務實現每天凌晨3點做一次日誌切割
- # chmod x /usr/local/nginx/log.sh
- # crontab -l
- * 3 * * * /usr/local/nginx/log.sh
3、Nginx的壓縮輸出配置與自動列目錄配置
3.1、Nginx的壓縮輸出配置
gzip(GNU-ZIP)是一種壓縮技術,通過gzip壓縮后的頁面可以變為原來的30%,是的用戶瀏覽頁面的時候速度會快很多,gzip的壓縮需要browser和server都支持.其過程是server端進行gzip壓縮,browser端解壓並解析.目前大多數browser都支持gzip過的頁面,如IE、firefox、chrome.
Nginx的壓縮輸出由一組gzip指令來實現,默認的Nginx配置文件僅僅為
gzip on;
這麼個簡單的指令,我們需要參考gzip模塊相關介紹,實現gzip的具體壓縮功能
如下:
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_vary on;
3.2、 Nginx的自動列目錄配置
當指定目錄下不存在index指令設置的默認首頁文件,當訪問該頁面的時候會出現403 Forbidden
的信息,可以通過在Nginx的主配置文件中的location / {......}目錄控制中配置自動列目錄,如下代碼:
location / {
autoindex on;
}
這樣就可以訪問頁面顯示出該目錄下的文件或目錄,而不是403 Forbidden信息.
3.3、 Nginx的瀏覽器本地緩存設置
browser caching是為了加速瀏覽,在用戶磁碟上對最近請求過的文檔進行存儲.當訪問者再次請求這個頁面的時候,browser就可以直接從本地磁碟顯示文檔,從而加速頁面的閱覽,最終到達節約網路資源.
browser caching通過expires指令輸出header頭來實現,該指令語法如下:
四、Nginx與PHP(FastCGI)的安裝、配置與優化
CGI全稱是“公共網關介面”(Common Gateway Interface),HTTP伺服器與你的或其它機器上的程序進行“交談”的一種工具,其程序須運行在網路伺服器上.
FastCGI是語言無關的、可伸縮架構的CGI開放擴展,其主要行為是將CGI解釋器進程保持在內存中並因此獲得較高的性能.眾所周知,CGI解釋器的反覆載入是CGI性能低下的主要原因,如果CGI解釋器保持在內存中並接受FastCGI進程管理器調度,則可以提供良好的性能、伸縮性、Fail- Over特性等等.
FastCGI的工作原理(摘自百度百科)
1、web server(Nginx)啟動時載入FastCGI進程管理器
2、FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程(可見多個php-cgi)並等待來自web server的連接
3、當客戶端請求到達web server時,FastCGI進程管理器選擇並連接到一個CGI解釋器.web server將CGI環境變數和標準輸入發送到FastCGI子進程php-cgi
4、FastCGI子進程完成處理后將標準輸出和錯誤信息從同一個連接返回web server,當FastCGI子進程關閉連接時,請求便高處理完成.FastCGI子進程接著等待並處理來自FastCGI進程管理器的下一個連接.
,如果是使用CGI技術的話,每一個Web請求PHP都必須重新解析php.ini、重新載入全部擴展並重初始化全部數據結構.使用FastCGI,所有這些都只在進程啟動時發生一次.然而不足之處在於FastCGI比CGI消耗更多的系統內存,FastCGI是多進程的,CGI是多線程的.
1、安裝PHP所需庫(FastCGI模式)
1.1、 編譯安裝PHP所需的支持庫
1>libiconv
GNU的libiconv是為nicode和其他的傳統編碼兩種應用設計的編碼轉換庫
http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz
tar zxvf libiconv-1.13.1.tar.gz
cd libiconv-1.13.1
./configure --prefix=/usr/local/
make && make install
2>libmcrypt
Libmcrypt is a library which provides a uniform interface to several symmetric encryption algorithms. It is intended to have a simple interface to access encryption algorithms in ofb, cbc, cfb, and ecb modes. The algorithms it supports are DES, 3DES, RIJNDAEL, Twofish, IDEA, GOST, CAST-256, ARCFOUR, SERPENT, SAFER , and more. The algorithms and modes are also modular so you can add and remove them on the fly without recompiling the library.
主要功能用於加密解密
http://down1.chinaunix.net/distfiles/libmcrypt-2.5.7.tar.gz
tar zxvf libmcrypt-2.5.7.tar.gz
cd libmcrypt-2.5.7
./configure
make && make install
3>mhash
mhash是哈希函數庫,比如用來計算消息的校驗碼之類的
http://sourceforge.net/projects/mhash/files/mhash/0.9.9/mhash-0.9.9.tar.gz/download
tar jxvf mhash-0.9.9.9.tar.bz2
cd mhash-0.9.9.9
./configure
make && make install
4>mcrypt
Mcrypt擴展庫可以對數據進行加密和解密
http://code.google.com/p/lcmp/downloads/detail?name=mcrypt-2.6.8.tar.gz
tar zxvf mcrypt-2.6.8.tar.gz.gz
cd mcrypt-2.6.8
/sbin/ldconfig
./configure
make && make install
5>建立軟連接
ln -s /usr/local/lib/libmcrypt.la /usr/lib/libmcrypt.la
ln -s /usr/local/lib/libmcrypt.so /usr/lib/libmcrypt.so
ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib/libmcrypt.so.4
ln -s /usr/local/lib/libmcrypt.so.4.4.7 /usr/lib/libmcrypt.so.4.4.7
ln -s /usr/local/lib/libmhash.* /usr/lib/
2、安裝mysql
http://www.mysql.com/downloads/mysql/5.1.html#downloads
3、安裝PHP
1、編譯安裝PHP(FastCGI模式)
tar zxvf php-5.2.17.tar.gz
gzip -cd php-5.2.17-fpm-0.5.14.diff.gz | patch -d php-5.2.17 -p1 //打補丁
cd php-5.2.17
./configure --prefix=/usr/local/php --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr/ --enable-xml --disable-rpath --enable-discard-path --enable-safe-mode --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --with-curlwrappers --enable-mbregex --enable-fastcgi --enable-fpm --enable-force-cgi-redirect --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-ldap --with-ldap-sasl --with-xmlrpc --enable-zip --enable-soap --without-pear --with-mysql=/usr/local/mysql/
make ZEND_EXTRA_LTBS='-liconv'
在執行編譯的時候,這裡遇到一個error:
4、編譯安裝php5擴展模塊
1>memcache
Memcache是一個高性能的分散式的內存對象緩存系統,通過在內存里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及資料庫檢索的結果等.
它可以應對任意多個連接,使用非阻塞的網路IO.由於它的工作機制是在內存中開闢一塊空間,然後建立一個HashTable,Memcached自管理這些HashTable.
php中的所講的memcache是PHP的一個擴展,是一個客戶端,用於連接memcached.
http://pecl.php.net/get/memcache-2.2.6.tgz
tar zxvf memcache-2.2.6.tgz
cd memcache-2.2.6
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
2>eaccelerator
eAccelerator是一個自由開放源碼php加速器,優化和動態內容緩存,提高了php腳本的緩存性能,是的PHP腳本在編譯的狀態下,對伺服器的開銷幾乎完全消除. 它還有對腳本起優化作用,以加快其執行效率.使PHP程序代碼執效率能提高1-10倍;
http://bart.eaccelerator.net/source/0.9.6.1/eaccelerator-0.9.6.1.tar.bz2
3>PDO_MYSQL
PDO_MYSQL is a driver that implements the PHP Data Objects (PDO) interface to enable access from PHP to MySQL 3.x, 4.x and 5.x databases.
http://pecl.php.net/get/PDO_MYSQL-1.0.2.tgz
tar zxvf PDO_MYSQL-1.0.2.tgz
cd PDO_MYSQL-1.0.2
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql/
make && make install
4>ImageMagick
ImageMagick是一套功能強大、穩定免費的工具集和開發包,可以用來讀、寫和處理超過89種基本格式的圖片文件,包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等格式.利用ImageMagick,你可以根據web應用程序的需要動態生成圖片, 還可以對一個(或一組)圖片進行改變大小、旋轉、銳化、減色或增加特效等操作,並將操作的結果以相同格式或其它格式保存.
ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz
tar zxvf ImageMagick-6.6.5-10.tar.gz
cd ImageMagick-6.6.5-10
./configure
make && make install
5>imagick
6>修改php.ini文件,配置eaccelerator加速PHP
1、查找/usr/local/php/etc/php.ini中的extension_dir = "./"
修改extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"
並在此行后添加如下幾行用於調用上面的擴展模塊
extension = "memcache.so"
extension = "pdo_mysql.so"
extension = "imagick.so"
查找output_buffering = Off,修改成output_buffering = On
2、創建目錄/usr/local/eaccelerator_cache
mkdir /usr/local/eaccelerator_cache
修改/usr/local/php/etc/php.ini在添加如下:
[eaccelerator]
zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="64"
eaccelerator.cache_dir=/usr/local/eaccelerator_cache
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
5、配置啟用php-cgi
/usr/sbin/groupadd www
/usr/sbin/useradd -g www www
修改php-fpm配置文件(php-fpm是為PHP打的一個FastCGI管理補丁),可以實現平滑變更php.ini配置而無需重啟php-cgi
vim /usr/local/php/etc/php-fpm.conf
把兩處nobody修改成www,並且去掉<--!-->這樣的註釋,表示使用www啟用進程php-cgi
然後通過 /usr/local/php/sbin/php-fpm start 來啟用php-cgi.
ps -ef |grep php-cgi 可以查看php-cgi進程
6、配置Nginx支持PHP
修改Nginx的主配置文件/usr/local/nginx/conf/nginx.conf
去掉下面代碼前面的#號:
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
include fastcgi_params;
}
然後在/usr/local/nginx/html目錄下創建index.php文件測試即可
*******************************************
對於Nginx還有很多東西可以整理出來,後續在跟大夥分享分享.
本文出自 「twenty_four」 博客,請務必保留此出處http://twentyfour.blog.51cto.com/945260/568906
[火星人 ] 初手必看之Nginx詳細介紹已經有924次圍觀