Nginx 是一個高性能的 Web 和反向代理服務器
優勢
高性能: 作為WEB服務器, 性能好開銷低, 10,000 非活動的 HTTP keep-alive 連接僅需要 2.5M 內存,能夠支持高達 50,000 個并發連接數的響應
可以作為反向代理服務器,性能優異
使用安裝配置簡單, 重新配置和在線升級可以無縫連接,無須中斷客戶端工作進程
缺點
nginx目前使用簡單的輪巡算法,無法做更復雜的負載均衡,比如基于鏈接計數的負載均衡
NGINX配置說明
配置模塊
main(全局設置)、server(主機設置)、upstream(負載均衡服務器設置)和 location(URL匹配特定位置的設置)
這四者之間的關系式:server繼承main,location繼承server,upstream既不會繼承其他設置也不會被繼承
配置完整示例說明
################## 全局配置?##################
user www-data
#運行nginx的用戶,默認由nobody賬號運行
worker_processes
#nginx啟動的工作進程數 - 每個進程平均消耗10-12M,一般指定和CPU數目相同
#error_log logs/error.log;
#error_log? logs/error.log? notice;
#error_log? logs/error.log? info;
#error_log 主模塊指令,定義全局錯誤日志文件。輸出級別有debug,info,notice,warn,error,crit可供選擇,其中debug輸出日志最詳細,而crit輸出日志最少
pid logs/nginx.pid;?
#nginx進程pid存儲文件路徑
worker_rlimit_nofile? 65535;
#用于綁定worker進程和CPU,Linux內核2.4以上使用
events {
??????? use epoll;
? ? ? ? #use是個事件模塊指令,用于指定工作模式,nginx支持的工作模式有select、poll、kqueue、epoll、rtsig、和/dev/poll,其中select和poll都是標準的工作模式。kqueue和epoll是高效的工作模式,其中kqueue用于BSD系統,而epoll用于Linux系統,對于Linux系統,epoll是首選。
? ? ? ? worker_connections? 65536;
? ? ? ? # 用于定義單個進程處理的最大并發連接數,默認為1024, 該值的設置考慮服務器的物理內存大小
? ? ? ? #最大客戶連接數由worker_connections和worker_processes決定,即max_client=worker_processes*worker_connections,在作為反向代理時變為:max_client= worker_processes*worker_connections/4, 除以4是一個經驗值設定。
? ? ? ? #并發請求受I/O約束,max_clients的值須小于系統可以打開的最大文件數
? ? ? ? #進程的最大連接數受Linux系統進程的最大打開文件數限制,在執行操作系統命令“ulimit –n 65536”后worker_connections的設置才生效。
? ? ? ? #而系統可以打開的最大文件數和內存大小成正比,一般1GB內存的機器上可以打開的文件數大約是10萬左右
? ? ? ? #查看服務器可以打開的文件句柄數是多少
? ? ? ? # cat /proc/sys/fs/file-max
? ? ? ? # 實質上max_clients就是受制于服務器的cpu和內存大小
}
##################?http服務器配置 ##################
http {
? ? ? ? include?????? mime.types;
? ? ? ? #include是個主模塊指令,實現對配置文件所包含的文件的設定,可以減少主配置文件的復雜度。
? ? ? ? default_type?application/octet-stream;
? ? ? ? #default_type屬于http核心模塊指令,默認為二進制流,也就是當文件類型未定義時使用這種方式,例如在沒有配置PHP環境時,nginx是不與解析的,此時,用瀏覽器訪問PHP文件就會出現下載窗口。
? ? ? ? #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
? ? ? ? #? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'$status $body_bytes_sent "$http_referer" '
? ? ? ? #? ? ? ? ? ? ? ? ? ? ? ? ? ? ?'"$http_user_agent" "$http_x_forwarded_for"';
? ? ? ? #log_format是nginx的httplog模塊指令,用于指定nginx的日志輸出格式,main為此日志格式的名稱,可以在下面的access_log指令中使用
? ? ? ? #access_log? logs/access.log? main;
? ? ? ??sendfile???on;
? ? ? ? tcp_nopush????on;
??????? tcp_nodelay? ? on;
? ? ? ? #sendfile用于開啟高效文件傳輸模式,將tcp_nopush和tcp_nodely另個指令設置為on,用于防止網絡阻塞。
? ??????#sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,
????????#對于普通應用,必須設為 on,
????????#如果用來進行下載等應用磁盤IO重負載應用,可設置為 off,
????????#以平衡磁盤與網絡I/O處理速度,降低系統的uptime.
? ? ? ??#keepalive_timeout? 0;
? ? ? ??keepalive_timeout? 65;
? ? ? ? #keepalive_timeout用于設置客戶端連續保持活動的超時時間。
? ? ? ? client_max_body_size?? 20m;
? ? ? ? #設置允許客戶端請求的最大單個文件字節數
? ??????client_header_buffer_size??? 32k;
? ? ? ? #用于指定客戶端請求頭的headerbuffer大小,對于大多數請求,1kb的緩沖區大小已經足夠,如果定義了消息頭或有更大的cookie,可以增加緩沖區大小。
? ? ? ? large_client_header_buffers??????? 4????? 32k;
? ? ? ? #用于指定客戶端請求中較大的消息頭的緩存最大數量和大小
? ? ? ? client_header_timeout 10;
? ? ? ? #client_header_timeout用于設置客戶端請求頭讀取超時時間,超過該時間客戶端還沒發送任何數據,nginx將返回“request time out(408)”錯誤。
? ? ? ? client_body_timeout??? 10;
? ? ? ? #client_body_timeout用于設置客戶端請求主體讀取超時時間,默認時間為602s,超過該時間客戶端還沒發送任何數據,nginx將返回“request timeout(408)”錯誤。
? ? ? ? send_timeout??????????????? 10;
? ? ? ? #send_timeout 用于指定響應客戶端的超時時間,這個超時僅限于兩個連接活動之間的時間,如果超過這個時間,客戶端沒有任何活動,nginx將會關閉連接
????????server_tokens off;
????????#隱藏Nginx版本號
}
##################?HttpGzip模塊配置?##################
gzip ?????? on;
#gzip on : 開啟實時gzip壓縮輸出數據流,減少網絡傳輸
gzip_min_length ? 1k;
##gzip_min_length設置允許壓縮的頁面最小字節數,頁面字節數從header頭的content-length中進行獲取。默認值是0,不管頁面大小都進行壓縮。建議設置成大于1k的字節數,小于1k可能會越壓越大。
gzip_buffers????? 4? 16k;
#gzip_buffers設置系統獲取幾個單位的緩存用于存儲gzip的壓縮結果數據流。4 16k代表申請4個單位為16K的內存作為壓縮結果流緩存
gzip_http_version?? 1.1;
#gzip_http_version用于識別 http 協議的版本,默認是1.1,目前絕大多數瀏覽器已經支持gzip解壓。
gzip_comp_level???? 6;
#gzip_comp_level:gzip壓縮比,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu)
gzip_types text/html text/plaintext/css text/javascript application/json application/javascriptapplication/x-javascript application/xml;
#gzip_types指定何種類型進行壓縮,無論是否指定,”text/html”類型總是會被壓縮的。
gzip_vary???on;
#gzip_vary:和http頭有關系,會在響應頭加個 Vary: Accept-Encoding ,可以讓前端的緩存服務器緩存經過gzip壓縮的頁面,例如,用Squid緩存經過Nginx壓縮的數據。。
##################?Server主機配置?##################
server {
? ? ? ? listen????8088;
? ? ? ? 主機監聽端口
? ? ? ??server_name?www.example.com?192.168.56.110;
? ? ? ? #指定IP地址或者域名,多個域名之間用空格隔開。
? ? ? ??charset? utf-8;
? ? ? ? #設定網頁默認的編碼格式
? ? ? ? location / {
? ? ? ? ? ? root? ?/home/www/myweb;
? ? ? ? ? ??#指定主機的網頁根目錄,這個目錄可以是相對路徑,也可以是絕對路徑
? ? ? ? ? ? index? index.html index.htm;
? ? ? ? ? ??#設定訪問的默認首頁地址,從左到右依次查找
? ? ? ? }
? ??????error_page? 404????????????? /404.html;
????????error_page 500 502 503 504 /50x.html;
? ? ? ? location = /50x.html {
? ? ? ? ? ? root? html;
? ? ? ? }
? ??????#error_page指令可以定制各種錯誤信息返回頁面,nginx會在主目錄的html目錄中查找指定的返回頁面
? ? ? ? #對 / 所有做負載均衡+反向代理
? ??????location / {
? ??????????proxy_pass??????? http://myserver;?
? ??????????#proxy_pass http://myserver:實現負載調度功能,proxy_pass指令用來指定請求轉向代理的后端服務器定義的服務器列表,即反向代理,對應upstream負載均衡器。地址也可以是主機名或者IP地址,如:proxy_passhttp://ip:port。
? ??????????proxy_next_upstream ??http_500 ?http_502 ?http_503 ??http_504?error ?timeout invalid_header;
????????????#proxy_next_upstream:定義故障轉移策略,當后端服務器節點返回500、502、503、504和執行超時等錯誤時,自動將請求轉發到upstream負載均衡組中的另一臺服務器,實現故障轉移。
? ??????}? ??
? ? ? ? location ~ .php$ {
????????????fastcgi_pass127.0.0.1:9000;
? ? ? ? ? ? fastcgi_index index.php;
? ? ? ? ? ? fastcgi_param? SCRIPT_FILENAME? $document_root$fastcgi_script_name;
? ? ? ? ? ? include fastcgi_params;
? ? ? ? ? ? [
? ??????????????fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2?keys_zone=licache:10m inactive=5m;
? ? ? ? ? ? ? ? #指定緩存文件路徑
????????????? ? fastcgi_cache_key "$request_method://$host$request_uri";
? ? ? ?? ? ? ? #
????????????? ? fastcgi_connect_timeout 300;
? ? ? ? ? ? ? ? #指定連接到后端FastCGI的超時時間
????????????? ? fastcgi_send_timeout 300;
? ? ? ? ? ? ? ? #指定向FastCGI傳送請求的超時時間,這個值是已經完成兩次握手后向FastCGI傳送請求的超時時間
????????????? ? fastcgi_read_timeout 300;
? ? ? ? ? ? ? ? #指定接收FastCGI應答的超時時間,這個值是已經完成兩次握手后接收FastCGI應答的超時時間
????????????? ? fastcgi_buffer_size 64k;
? ? ? ? ? ? ? ? #用于指定讀取FastCGI應答第一部分需要用多大的緩沖區,這個值表示將使用1個64KB的緩沖區讀取應答的第一部分(應答頭),可以設置為fastcgi_buffers選項指定的緩沖區大小
????????????? ? fastcgi_buffers 8 64k;
? ? ? ? ? ? ? ? #指定本地需要用多少和多大的緩沖區來緩沖FastCGI的應答請求。如果一個PHP腳本所產生的頁面大小為256KB,那么會為其分配4個64KB的緩沖區來緩存;如果頁面大小大于256KB,那么大于256KB的部分會緩存到fastcgi_temp指定的路徑中,但是這并不是好方法,因為內存中的數據處理速度要快于硬盤。一般這個值應該為站點中PHP腳本所產生的頁面大小的中間值,如果站點大部分腳本所產生的頁面大小為256KB,那么可以把這個值設置為“16 16k”、“4 64k”等
????????????? ? fastcgi_busy_buffers_size 128k;
? ? ? ? ? ? ? ? #默認值是fastcgi_buffers的兩倍
????????????? ? fastcgi_temp_file_write_size 128k;
? ? ? ? ? ? ? ? #表示在寫入緩存文件時使用多大的數據塊,默認值是fastcgi_buffers的兩倍。fastcgi_cache表示開啟FastCGI緩存并為其指定一個名稱。開啟緩存非常有用,可以有效降低CPU的負載,并且防止502錯誤的發生,但是開啟緩存也會引起很多問題,要視具體情況而定
????????????? ? fastcgi_cache licache;
????????????? ? fastcgi_cache_valid 200 302 1h;
????????????? ? fastcgi_cache_valid 301 1d;
????????????? ? fastcgi_cache_valid any 1m;
????????????? ? fastcgi_cache_min_uses 1;
????????????? ? fastcgi_cache_use_stale error timeout invalid_header http_500;
????????????? ? open_file_cache max=65535 inactive=20s;
????????????? ? open_file_cache_min_uses 1;
????????????? ? open_file_cache_valid 30s;
? ? ? ? ? ? ? ? #用來指定應答代碼的緩存時間,實例中的值表示將200和302應答緩存一個小時,將301應答緩存1天,其他應答均緩存1分鐘
? ? ? ? ? ? ]
? ? ? ? ? ? #[]內為實際include的fastcgi配置
? ? ? ? }
????????#PHP 腳本請求全部轉發到 FastCGI處理. 使用FastCGI默認配置.
? ? ? ? location ~ /.ht {
? ? ? ? ? ? deny all;
? ? ? ? }
????????#禁止訪問 .htxxx 文件
}
################## URL配置設置?##################
###location支持正則表達式和條件判斷匹配,可以通過location指令實現nginx對動靜態網頁的過濾處理。
location?~ * \.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$??
?{??
?? ??root?? /web/wwwroot/html;
? ??expires????? 30d;
????#expires指定靜態文件的過期時間
?}
#所有擴展名為gif|jpg|jpeg|bmp|png|ico|txt|js|css的靜態文件都交給nginx處理
location? ~ .*.jsp$
{
? ??Index?????? index.jsp;
? ??Proxy_pass???? http://localhost:8080;
}
#location對此虛擬機下動態網頁的過濾處理,也就是將所有.jsp為后綴的文件都交給本機8080端口處理。
################?負載均衡配置 (實例) ################
upstream? myserver {
? ? ? ? # upstream? example.com;指定一個負載均衡器的名稱為example.com;。該名稱為任意##的,使用時調用即可。
? ? ? ? 空/ip_hash/weight/fair(第三方)/url_hash(第三方);
? ? ? ? # 此處設置負載均衡策略
??????? server? 192.168.56.102:8088? ? ? ??
? ? ? ? ## 空, 默認設置, 如果不設置負載均衡策略,默認使用輪詢的方式進行負載,每一個請求按時間順序逐一分配到不同的后端服務器。假設后端服務器down掉。能自己主動剔除。盡管這樣的方式簡便、成本低廉。但缺點是:可靠性低和負載分配不均衡,適用于圖片服務器集群和純靜態頁面服務器集群
? ? ? ??ip_hash;
????????server 10.0.0.10:8080;
????????server 10.0.0.11:8080;
? ? ? ? ##ip_hash調度算法,每個請求按IP的hash結果分配,是來自同一個IP的訪客##固定訪問一個后端服務器,有效解決了動態服務器存在的session共享問題,
??????? server? 10.0.0.88:8088 weight=5
??????? server? 10.0.0.77:8088 weight=10
? ? ? ? ##指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的情況。例如以下所看到的。10.0.0.77的訪問比率要比10.0.0.88的訪問比率高一倍
? ??????server 10.0.0.10:8080;
????????server 10.0.0.11:8080;
????????fair;
? ??????##按后端服務器的響應時間來分配請求。響應時間短的優先分配
? ? ? ??server 10.0.0.10:7777;
????????server 10.0.0.11:8888;
????????hash $request_uri;
????????hash_method crc32;
? ??????##按訪問url的hash結果來分配請求,使每一個url定向到同一個后端服務器。后端服務器為緩存時比較有效。
? ??????##注意:在upstream中加入hash語句。server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法。
????????狀態設置
? ??????server 10.0.0.11:9090 down;?
? ? ? ? down:表示當前server暫時不參與負載均衡
? ??????server 10.0.0.11:8080 weight=2
? ? ? ? weight:默認1,weight越大,負載的權重就越大。
? ???????server? 192.168.56.103:8088 max_fails=3? fail_timeout=20s;
? ? ? ? max_fails:允許請求失敗的次數,默認為1。當超過最大次數時,返回proxy_next_upstream模塊定義錯誤。
? ? ? ? fail_timeout:經歷max_fails次失敗后,暫停服務的時間。
? ??????server 10.0.0.11:7070 backup
? ? ? ? #backup:預留的備份機器,當其他所有的非backup機器出現故障或正在忙時,##才會請求backup機器,該機器壓力最輕。當調度算法為ip_hash,狀態不能##為backup和weight;
}
##############?http_proxy反向代理設置 ##############
####該部分亦可以使用寫進proxy.conf文件中,再使用include指令包含進來,######從而使配置顯得更簡練
######用法:include? ?/usr/local/etc/nginx/nginx.conf ####
client_body_buffer_size?? 128k;
#client_body_buffer_size:用于指定客戶端請求主體緩沖區大小,意思就是先保存到本地再傳給用戶。
proxy_connect_timeout?? 75;
#nginx跟后端服務器連接超時時間(代理連接超時),單位秒
#連接成功后,與后端服務器兩個成功的響應操作之間超時時間(代理接收超時)
proxy_send_timeout?? 75;
#proxy_send_timeout:后端服務器的數據回傳時間,超時則斷開連接
proxy_read_timeout?? 75;
#proxy_read_timeout:設置nginx從代課的后端服務器獲取信息的時間,即在規定時間之內后端服務器必須傳完所有的數據,否則斷開連接。
proxy_buffer_size?? 4k;
#設置代理服務器(nginx)從后端服務器讀取并保存用戶頭信息的緩沖區大小,默認與proxy_buffers大小相同,其實可以將這個指令值設的小一點
proxy_buffers?? 4 ?32k;
#proxy_buffers緩沖區,nginx針對單個連接緩存來自后端realserver的響應,網頁平均在32k以下的話,這樣設置
proxy_busy_buffers_size? ??64k;
#高負荷下緩沖大小(官方建議為proxy_buffers*2)
proxy_temp_file_write_size? ?64k;
#指定proxy緩存臨時文件的大小
proxy_temp_path ???/usr/local/nginx/proxy_temp 1 2;
#當緩存被代理的服務器響應到臨時文件時,這個選項限制每次寫臨時文件的大小。proxy_temp_path(可以在編譯的時候)指定寫到哪那個目錄。
proxy_redirect off;
# 后端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
proxy_set_header? Host?$host;
proxy_set_header? X-Real-IP?$remote_addr;?
proxy_set_header? X-Forwarded-For? $proxy_add_x_forwarded_for;
#proxy_set_header:設置由后端服務器獲取用戶主機或真實IP地址,以及代理者的真實IP
###############?stub_status監控模塊配置 ###############
stub_status模塊主要用于查看Nginx的一些狀態信息
本模塊默認是不會編譯進Nginx的,如需手動添加./configure –with-http_stub_status_module?
??location /Nginx_status {
??????? stub_status ? on;
????????#啟用stub_status的工作狀態統計功能
??????? access_log ??? log/NginxStatus.log;
????????# access_log用來指定stub_status模塊的訪問日志文件
????? ??auth_basic? ? ? ?“NginxStatus”;
????????#auth_basic是nginx的一種認證機制
? ? ? ? auth_basic_user_file???? ../htpasswd;
????????#auth_basic_user_file用來指定認證的密碼文件
????????#nginx的auth_basic采用的是與Apache兼容的密碼文件,所以需要采用
? ? ? ? #Apache的htpasswd命令來生成密碼文件
????????#如添加一個fieldyang 用戶可以用該方式生成密碼文件
????????#/usr/local/apache/bin/htpasswd? –c?/opt/nginx/conf/htpasswd fieldyang??
????????#要查看nginx運行狀態,只需在http://ip/NginxStatus輸入賬號密碼即可
? ??????allow? 192.168.10.0/24;
? ??????allow? 192.168.56.100;
? ??????deny all;
?}