Nginx是由俄羅斯軟件工程師IgorSysoev開發(fā)的一個高性能的HTTP和反向代理服務(wù)器,具備IMAP/POP3和SMTP服務(wù)器功能。Nginx最大的特點是對高并發(fā)的支持和高效的負載均衡,在高并發(fā)的需求場景下,是Apache服務(wù)器不錯的替代品。目前,包括新浪、騰訊等知名網(wǎng)站已經(jīng)開始使用Nginx作為Web應(yīng)用服務(wù)器。 Nginx配置一個神奇的Web服務(wù)器,我們在使用的時候有不少需要注意的,接下來我們就看看如何才能簡單明了的進行Nginx服務(wù)器的配置。 #運行用戶 user nobody nobody; #啟動進程,根據(jù)硬件調(diào)整,大于等于cpu核數(shù) worker_processes 2; #指定進程可以打開的最大描述符 worker_rlimit_nofile 204800; 這個指令是指當一個nginx進程打開的最多文件描述符數(shù)目,理論值應(yīng)該是最多打開文 件數(shù)(ulimit -n)與nginx進程數(shù)相除,但是nginx分配請求并不是那么均勻,所以最好與ulimit -n 的值保持一致。 現(xiàn)在在linux 2.6內(nèi)核下開啟文件打開數(shù)為65535,worker_rlimit_nofile就相應(yīng)應(yīng)該填寫65535。這是因為nginx調(diào)度時分配請求到進程并不是那么的均衡,所以假如填寫10240,總并發(fā)量達到3-4萬時就有進程可能超過10240了,這時會返回502錯誤。 #全局錯誤日志[debug|info|notice|warn|error|crit]及PID文檔位置 error_log logs/error.log notice; pid logs/Nginx.pid; events { use epoll; #使用epoll的I/O 模型 補充說明: 與apache相類,nginx針對不同的操作系統(tǒng),有不同的事件模型 A)標準事件模型 Select、poll屬于標準事件模型,如果當前系統(tǒng)不存在更有效的方法,nginx會選擇select或poll B)高效事件模型 Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS X系統(tǒng)使用kqueue可能會造成內(nèi)核崩潰。 Epoll:使用于Linux內(nèi)核2.6版本及以后的系統(tǒng)。 /dev/poll:使用于Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。 Eventport:使用于Solaris 10. 為了防止出現(xiàn)內(nèi)核崩潰的問題, 有必要安裝安全補丁 worker_connections 1024; #工作進程的最大連接數(shù)量,根據(jù)硬件調(diào)整,和前面工作進程配合起來用,盡量大,但是別把cpu跑到100%就行 每個進程允許的最多連接數(shù), 理論上每臺nginx服務(wù)器的最大連接數(shù)為worker_processes*worker_connections } #設(shè)定http服務(wù)器,利用他的反向代理功能提供負載均衡支持 http { #設(shè)定mime類型 include conf/mime.types; default_type application/octet-stream; #設(shè)定日志格式 log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$gzip_ratio"'; log_format download '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$http_range" "$sent_http_content_range"'; $remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址; $remote_user:用來記錄客戶端用戶名稱; $time_local: 用來記錄訪問時間與時區(qū); $request: 用來記錄請求的url與http協(xié)議; $status: 用來記錄請求狀態(tài);成功是200, $body_bytes_s ent :記錄發(fā)送給客戶端文件主體內(nèi)容大??; $http_referer:用來記錄從那個頁面鏈接訪問過來的; $http_user_agent:記錄客戶瀏覽器的相關(guān)信息; 通常web服務(wù)器放在反向代理的后面,這樣就不能獲取到客戶的IP地址了,通過$remote_add拿到的IP地址是反向代理服務(wù)器的iP地址。反向代理服務(wù)器在轉(zhuǎn)發(fā)請求的http頭信息中,可以增加x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務(wù)器地址; #設(shè)定請求緩沖 client_header_buffer_size 1k; large_client_header_buffers 4 4k; #關(guān)閉報錯時的Nginx版本顯示 server_tokens off; sendfile on; #打開系統(tǒng)函數(shù)sendfile()支持 tcp_nopush on; #防止網(wǎng)絡(luò)阻塞 tcp_nodelay on; #防止網(wǎng)絡(luò)阻塞 keepalive_timeout 65; #上述四項可以有效提高文件傳輸性能 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; #設(shè)置上述數(shù)值設(shè)置太小時若負載上來時可能報 502 Bad Gateway #開啟gzip模塊 gzip on; gzip_min_length 1k; #最小壓縮文件大小 gzip_buffers 4 16k; #壓縮緩沖區(qū) gzip_http_version 1.0; #壓縮版本(默認1.1,前端為squid2.5使用1.0 gzip_comp_level 2; #壓縮等級 gzip_types text/plain application/x-javascript text/css application/xml; #壓縮類型,默認就已經(jīng)包含text/html 所以下面就不用再寫了,當然寫上去的話,也不會有問題,但是會有一個warn gzip_vary on; #此選項可讓前端的緩存服務(wù),如squid緩存經(jīng)過nginx壓縮的數(shù)據(jù) #該選項在做反向代理時設(shè)定壓縮,后面參數(shù)為驗證的header頭信息,再做相應(yīng)的壓縮處理,關(guān)閉為off #gzip_proxied expired no-cache no-store private no_last_modified no_etag auth any #設(shè)定access log access_log logs/access.log main; client_header_timeout 3m; client_body_timeout 3m; #設(shè)定負載均衡的服務(wù)器列表 upstream mysvr { #weigth參數(shù)表示權(quán)值,權(quán)值越高被分配到的幾率越大 #本機上的Squid開啟3128端口 server 192.168.8.1:3128 weight=5; server 192.168.8.2:80 weight=1; server 192.168.8.3:80 weight=6; } #設(shè)定虛擬主機 server { listen 80; #配置監(jiān)聽端口 server_name 192.168.8.1 www.; #IP地址或者域名 ,多域名用空格隔開 charset gb2312; #默認編碼 index index.html index.htm index.php; #默認訪問文件,從前到后的順序查找 #limit_conn connlimit 20; 限制一個IP只能最多只能發(fā)起20個連接,超過報 503 Service unavailable #設(shè)定本虛擬主機的訪問日志格式 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" $http_x_forwarded_for'; #設(shè)定本虛擬主機的訪問日志路徑 access_log logs/www..access.log main; #假如訪問 /img/*, /js/*, /css/* 資源,則直接取本地文檔,不通過squid #假如這些文檔較多,不推薦這種方式,因為通過squid的緩存效果更好 location ~ ^/(img|js|css)/ { root //Html; access_log off; #不記錄訪問日志 expires 24h; #緩存過期時間 } #對 "/" 啟用負載均衡,location ~* .(mp3|exe)$ 對以“mp3或exe”結(jié)尾的地址進行負載均衡 location / { #設(shè)置被代理服務(wù)器的端口或套接字,以及URL proxy_pass http://mysvr; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #以上三行,目的是將代理服務(wù)器收到的用戶的信息傳到真實服務(wù)器上 client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k; } #設(shè)定查看Nginx狀態(tài)的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file conf/htpasswd; } } } 備注:conf/htpasswd 文檔的內(nèi)容用 apache 提供的 htpasswd 工具來產(chǎn)生即可! 查看 Nginx 運行狀態(tài) 輸入地址http://www./NginxStatus/ 。輸入驗證賬號密碼,即可看到類似如下內(nèi)容: Active connections: 328 server accepts handled requests 9309 8982 28890 Reading: 1 Writing: 3 Waiting: 324 
http://blog./?p=196
轉(zhuǎn)載:|REKFAN|系統(tǒng)運維| ? Linux學習筆記_Nginx配置詳解
|