常見參配置實戰技巧
????下面會講解實戰中應該怎么配置更為合理。
?
1.user
????默認是nobody,如果使用nobody,Nginx在運行過程中會出現很多操作沒有權限,比如寫硬盤。一般都是用低于root級別的用戶,比如www,并且可以在linux下設置www禁止ssh登錄服務器,提高安全性;
?
2.worker_processes
????代表Nginx worker的進程數,一般情況下建議和機器的核數相同,也可以配置 worker_processes auto ; (Nginx1.2.5版本添加的) 自動根據cpu核數進行進程啟動;
????但是實際應用中,服務器不一定只跑了Nginx,需要考慮機器資源會被分配到哪些服務上,避免進程啟動過多,和其他服務競爭cpu,導致過多上下文切換;
?
3.worker_cpu_affinity auto
Nginx 1.9.10添加的功能,表示可以根據服務器的核數自動配cpu親緣性,提升Nginx的性能;
?
4、error_log & access_log
關于日志記錄的,error_log 配置為error級別, 減少不必要的日志記錄, 如果是測試環境可以開啟info級別。日志記錄需要考慮硬盤的獨立性,不要使用linux的根分區,避免大量的io影響Linux服務器吞吐能力。單獨掛載一個磁盤,獨立使用io;
另外硬盤的使用壽命需要注意,關注message的日志,定期檢查硬盤(Nginx記錄日志是異步處理,并且不會因為硬盤的問題,導致請求異常,但是會影響日志的記錄) ;
?
5.worker_priority
????配置Nginx在linux服務器上資源使用的優先級,作為反向代理服務,應該擁有極高的優先級,建議配置到-10;
?
6.gzip_comp_level
????壓縮等級,等級最高為9,等級越高壓縮后的文件越小,但是消耗的cpu也會更多,經過測試,壓縮等級7 和 9 的文件大小相比,其實只有細微的差別,用5-7的等級足矣;
?
7.upstream塊
????配置上游服務器,可以結合 proxy_next_upstream 等指令做大量的優化,我會在下面的章節單獨說明;
?
8.error_page
????錯誤重定向,可以捕獲上游服務器錯誤的狀態碼后,將請求重定向到其它地方,比如提供友好頁面,關于error_page的更強大的使用方式。
?
9.location & root
????通過root路徑可以讀取靜態文件,在1.7.11以前的版本,Nginx讀取硬盤的文件,都是阻塞型操作,后面引入了線程池,使得讀取硬盤提供了非阻塞的操作,極大的提升了硬盤的io,也提升了proxy_cache的能力。
Nginx的常見配置在使用中都有著不同的變化,那么對于更為復雜的配置來說,其配置就顯得更為精妙了,所以熟悉Nginx的官方wiki是發揮它巨大作用的基礎。
?
常見配置注解
?
user ?www www;???
????#定義Nginx運行的用戶和用戶組
worker_processes ?2;????
????#Nginx進程數
worker_cpu_affinity auto;????
????#配置Nginx進程cpu親源性
error_log ?/var/log/error_log ?info;????
????#全局錯誤日志定義類型?,默認是error
worker_rlimit_nofile 65535;????
????#一個Nginx進程打開的最多文件描述符數量
pid /var/run/nginx.pid;????
????#進程文件
worker_priority -10;????
????#linnx系統下的資源使用的優先級
worker_rlimit_nofile ?65535;????
????#worker進程的最大打開文件數限制
worker_shutdown_timeout ?30;????
????#30s內Nginx無法平滑退出,就強行關閉進程
events {
??worker_connections ?10000;????
????#單個進程最大連接數(整個Nginx最大連接數=連接數*進程數)
??use epoll;????
????#epoll linux2.6+內核高性能的網絡io,?如果跑在FreeBSD上面,就用kqueue模型。
}
?
http {
????include ??????conf/mime.types;????
????#文件擴展名與文件類型映射表
????default_type ?application/octet-stream;?????
????#默認文件類型
????log_format main ????'$remote_addr - $remote_user [$time_local] '
?????????????????????????'"$request" $status $bytes_sent '
?????????????????????????'"$http_referer" "$http_user_agent" '
?????????????????????????‘"$http_cookie"';???
????#定義日志格式
????client_header_buffer_size ???1k;????
????#設置用戶請求頭所使用的buffer大小
????large_client_header_buffers ?4 4k;????
????#當默認的緩沖不夠用時就會使用此參數。
????server_names_hash_bucket_size 128;????
????#服務器名字的hash表大小
????client_header_buffer_size 32k;????
????#上傳文件大小限制
????gzip?on;????
????#開啟gzip
????gzip?_comp_level 6;????
????#壓縮等級
????gzip?_min_length ?1100;????
????#設置允許壓縮的頁面最小字節數
????gzip?_buffers ????4 8k;????
????#設置系統獲取幾個單位的緩存用于存儲gzIP的壓縮結果數據流。4 8k?代表以8k為單位,按照原始數據大小以8k為單位的4倍申請內存。
????gzip?_types ??????text/plain text/css;????
????#匹配MIME類型進行壓縮
????output_buffers ??2 32k;????
????#設置用于從磁盤讀取響應的緩沖區的數量和大小。?此設置為:按照原始數據大小以32K為單位的2倍大小申請內存空間。
????sendfile ????????on;????
????#啟用sendfile()函數
????tcp_nopush ??????on;????
????#防止網絡阻塞,需要sendfile開啟
????tcp_nodelay ?????on;????
????#防止網絡阻塞,需要sendfile開啟
????keepalive_timeout 90s;????
????#長連接超時時間,單位是秒
????upstream backend {
????server 192.168.1.12:8081 weight=3;
????server 192.168.1.13:8081 weight=2;
}?
????#upstream塊,weight是權重,權重越高,請求的比例越高。?
????server {
????????listen ??????80;?????
?????????#http監聽端口
????????server_name ?your.example.com;??
????????#域名
????????access_log ??/var/log/nginx.access_log ?main;?????
????????#訪問日志記錄
????????charset ?koi8-r;????
????????#默認編碼
????????location / {
????????????proxy_pass ????????http://backend ;
????????????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; ??????}????
????????#后端的應用服務器通過X-Forwarded-For獲取用戶的真實IP
????????error_page ?404 ?/404.html;????
????????#對于后端應用服務器拋出的錯誤404?進行頁面重定向
????????location /404.html {
????????????root ?/spool/www;
????????}?
????????#?匹配URL為jpg,jpeg,gif結尾的,直接去系統文件讀取
????????location ~* \.(jpg|jpeg|gif)$ {
????????????root ????????/spool/www;
????????????expires ?????30d;????
????????#瀏覽器緩存的時間
????????}
????}