nginx作為http服務器常用模塊
阿新 • • 發佈:2018-08-09
epoll handle aid error_log 通配符 元數據 端口 method 等於 1、詳細描述常見nginx常用模塊和模塊的使用示例
常用模塊:
1.nginx核心功能模塊(Core functionality)
accept_mutex on|off; #Context:events
這個指令的意義:當一個新連接或者說用戶請求到達nginx服務時,如果accept_mutex為on,
那麽多個worker將以串行方式來處理,其中一個worker會被激活,其他worker繼續保持休眠狀態,
如果accept_mutex為off,那麽所有的worker將會被喚醒,但只有一個worker會獲取新連接,其他worker會重新休眠。
這可以算是驚群問題吧。當網站並發量很大時,可以設置為off,
error_log 錯誤日誌文件路徑,錯誤記錄等級,等級從低到高為debug, info, notice, warn, error, crit, alert, emerg 例:error_log /var/log/nginx/error.log; events 用來指定nginx的工作模式及連接數上限 例:events { use epoll; #使用epoll I/O傳輸模型 worker_connections 1024; #每個worker允許的最大用戶請求數 } ***worker_connections #Context:events 每一個worker進程能並發處理(發起)的最大連接數,並不是越大越好 ***需要深入理解的優化選項 worker_cpu_affinity 將worker進程固定在指定的CPU(或核心)中,因為nginx默認是隨機分配cpu(或核心)的, 此設置可將nginx進程固定在指定的CPU(或核心)上,以加快處理速度降低出錯率。 例:worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; worker_priority 讓worker以指定nice值工作,-20~19 nice值越高就會優先獲取CPU資源; nginx默認狀態下的nice值為0 worker_processes 設置nginx的work process的數量,推薦設置為等於或略小於CPU的核心數, 因為若設置為大於CPU的核心數時會產生擁擠,範圍會影響性能,若設置成auto,默認數量為CPU的核心數 include file | mask; 將指定的文件包含在配置中,nginx運行時會自動加載 例:include vhost/*.conf master_process on | off; 確認master process的開啟狀態。 multi_accept on | off; #Context:events 當multi_accept為on時,所有的新連接情求將同時被worker process同時接收處理, 當multi_accept為off時,worker process一次只接收處理一個新連接 默認為off pid 設置nginx主進程ID文件位置 例:pid log/nginx.pid; use 設置進程連接的方式。值得註意的是此項一般不做設置,因為nginx會自動選擇最適合系統的方式。 There is normally no need to specify it explicitly, because nginx will by default use the most efficient method. user 指定nginx主進程的用戶及組 2.http核心功能模塊(ngx_http_core_module) alias #Context:location alias表示路徑別名,alias後面接路徑,也就是用戶訪問的真正路徑,一般用在location環境下 例:location /i/ { alias /data/w3/images/; #一定要記得結尾加/ } 當用戶請求為路徑URI/i/時,實際訪問的是URI/data/w3/images/ 此處可深入對比root與alias的區別: 1.root指定的是location匹配訪問的path目錄的上一級目錄,也可以理解為location匹配訪問的起始根目錄 2.alias指定的是location匹配訪問的path目錄的真正目錄路徑,而location後是path目錄別名 3.對於root來說,location後的path目錄必須真實存在 4.對於alias來說,location後的path目錄可以不存在 5.alias只能用在location中,而root可用在 http,server,location,if in location中 6.有網友建議 1)在location /中配置root目錄; 2)在location /path中配置alias虛擬目錄。 listen #Context:server 設置監聽IP的地址和端口,一般只需設置ip和端口 例: listen 127.0.0.1:8000; listen 127.0.0.1; listen 8000; listen *:8000; listen localhost:8000; 擴展設置:listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size] default_server:設定為默認虛擬主機; ssl:限制僅能夠通過ssl連接提供服務; backlog=number:後援隊列長度; rcvbuf=size:接收緩沖區大小; sndbuf=size:發送緩沖區大小; server #Context:http 用來定義虛擬主機,格式為server { ... } server_name #Context:server 設置虛擬主機的主機名,可使用正則表達式進行匹配 例:server { server_name ~^(www\.)?(.+)$; index index.php index.html; root /nginx/$2; } 這裏用到了正則表達式後向引用的知識,可以實現在一個server中配置多個站點, 當輸入站點www.fff.com時對應站點的主目錄為/nginx/fff.com目錄 當輸入站點www.ddd.org時對應站點的主目錄為/nginx/ddd.com目錄 目錄必須存在 tcp_nodelay on|off; #Context:http, server, location 只在keepalived下開啟有效,長連接時不做報文打包發送,不產生延遲(delay) tcp_nopush on|off; #Context:http, server, location 在 nginx 中,tcp_nopush 配置和 tcp_nodelay "互斥"。它可以配置一次發送數據的包大小。也就是說,它不是按時間累計 0.2 秒後發送包,而是當包累計到一定大小後就發送。 在 nginx 中,tcp_nopush 必須和 sendfile 搭配使用。 sendfile #Context:http, server, location, if in location 此選項可提高web服務器的傳輸性能,不使用sendfile的傳統網絡傳輸: read(file,tmp_buf, len); write(socket,tmp_buf, len); 硬盤 --> kernel buffer --> user buffer --> kernel socket buffer --> 協議棧 使用sendfile的網絡傳輸: sendfile(socket,file, len); 硬盤 --> kernel buffer (快速拷貝到kernelsocket buffer) --> 協議棧 sendfile省去了很多中間過程,從而提高了傳輸速度 keepalive_timeout keepalive的超時時間 例:keepalive 75s; root #Context:http, server, location, if in location 設置站點的根目錄 location #Context: server, location 根據用戶請求的URI做訪問邏輯的設置,location下的root比server下的root有更高的優先權? 例: location = / { [ configuration A ] } location / { [ configuration B ] } location /documents/ { [ configuration C ] } location ^~ /images/ { [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { [ configuration E ] } error_page #Context:http, server, location, if in location 設置當用戶請求發生錯誤時nginx反饋給用戶錯誤顯示的URI 設置方法有多種: 例:1. error_page 502 503 /50x.html; #當訪問出現502 503錯誤時,就向用戶反饋50x.html的內容 2. error_page 502 503 =200 /50x.html; #當訪問出現502 503時,向用戶反饋狀態碼為200,並反饋50x.html的內容 50x.html可替換為其他內容,如jpg,gif,php文件 3. error_page 404 = http://www.baidu.com; #當訪問出現404錯誤時,將用戶請求跳轉至百度主頁 4. location / { error_page 404 = @fallback; } location @fallback { proxy_pass http://backend; } keepalive_timeout 設置長連接的超時時間,設置0時表示關閉長連接,默認為75s 例:keepalive_timeout 40s; keepalive_disable none | browser ...; 設置禁止長連接的瀏覽器 keepalive_requests 設置一次長連接允許的最大請求數,默認為100 client_body_buffer_size # Context:http, server, location body是指報文的主體部分,此選項用於設置接收客戶端請求報文的body部分的緩沖區大小, 默認為16k,一旦超過設置的值,便會發起磁盤I/O,影響站點性能, 只有在允許用戶請求或上傳大於16k數據時,才有必要調整此項, 但當用戶上傳數據大到不得不直接儲存在磁盤上時則需使用client_body_temp_path client_body_temp_path # Context:http, server, location 這裏涉及到了當用戶較多且用戶存放文件較多時,各用戶如何快速準確的找到各自存放在站點的文件的問題。 此選項可設置文件分級存放, 例:client_body_temp_path /var/tmp/client_body 2 1 1 #用戶存放主目錄為/var/tmp/client_body 創建16*16個一級子目錄, 每個一級子目錄下創建16個二級子目錄,每個二級子目錄下創建16個三級子目錄 這是一種算法機制,為用戶訪問磁盤數據時提供一種快捷的路徑路由機制 aio on|off aio是指異步非阻塞IO模型,在nginx第一講中有詳細介紹 open_file_cache Context:http, server, location 用於設置服務器訪問頻率較高文件的元數據緩存,將訪問頻率較高的文件緩存至內存中, 當用戶訪問時不需要再進行磁盤查找,可直接根據文件的元數據找到文件進行下一步操作, 大大提升了用戶訪問效率。 例:open_file_cache off; open_file_cache max=1000 inactive=20s; #最大緩存1000個緩存項 緩存項的非活動時長20s,受open_file_cache_min_uses選項的影響,在設定時間內訪問命中數少於open_file_cache_min_uses設置數時,緩存將被清理 open_file_cache_uses 參照open_file_cache 例:open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_error on; #是否緩存查找時發生錯誤的文件信息的 3.基於IP的訪問控制模塊(ngx_http_access_module) allow 允許訪問 deny 拒絕訪問 例:location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; allow 2001:0db8::/32; deny all; } 4.基於用戶登錄的訪問控制模塊(ngx_http_auth_basic_module) auth_basic #Context:http, server, location, limit_except 反饋給用戶的服務器認證信息,必須與auth_basic_user_file配合使用 auth_basic_user_file 設置用戶認證文件的路徑,配置用戶認證的用戶名與密碼可用httpd-tools來實現 1.yum -y install httpd-tools #安裝httpd-tools 2.htpasswd -c -m /etc/nginx/.ngxpwd ready #指定密碼文件路徑與文件名,用戶名為ready 例:server { server_name www.hhh.com; root /nginx/test2/; location ~* ^/(login|admin) { #alias /admin/; #為何加此項會訪問不成功,改為location /login/卻會訪問成功? auth_basic "why?"; auth_basic_user_file /etc/nginx/.ngxpwd; } #root路徑下用戶請求以admin或login開頭時,都會出現用戶認證 5.nginx訪問狀態模塊(ngx_http_stub_status_module) } stub_status 可以查看nginx的狀態信息,此信息一定要保密,可單獨創建一個location再配合auth_basic_user_file與auth_basic使用 例: location /abc { stub_status; auth_basic "why?"; auth_basic_user_file /etc/nginx/.ngxpwd; } 輸出示例: Active connections: 3 #當前的活動鏈接數 server accepts handled requests #accept已經接受的用戶請求數,handled已經處理完成的用戶請求數,requests總請求數 303 303 2533 Reading: 0 Writing: 1 Waiting: 2 #Reading:處於讀取客戶端請求報文首部的連接的連接數; #Writing:處於向客戶端發送響應報文過程中的連接數; #Waiting:處於等待客戶端發出請求的空閑連接數 6.nginx訪問日誌模塊(ngx_http_log_module) access_log #Context:http, server, location, if in location, limit_except 設置訪問日誌路徑,可在全局設置,也可在server,location等中做精細設置,便於不同主機的訪問精細管理 也可壓縮打包處理 例:access_log /path/to/log.gz combined gzip buffer=16k flush=5m; #buffer可設置訪問日誌的緩沖區大小,flush為刷新周期 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"‘; 7.ngx_http_gzip_module nginx中gzip的主要作用就是用來減輕服務器的帶寬問題,經過gzip壓縮後的頁面大小可以變為原來的30%甚至更小, 這樣用戶瀏覽頁面時的速度會快很多。gzip的壓縮頁面需要瀏覽器和服務器雙方都支持,實際上就是服務器端壓縮, 傳到瀏覽器後瀏覽器解壓縮並解析。目前的大多數瀏覽器都支持解析gzip壓縮過的頁面。默認為off 例:gzip on; gzip_comp_level 2; #壓縮等級,默認為1 gzip_min_length 1000; #啟用壓縮功能的臨界值 gzip_proxied expired no-cache no-store private auth; gzip_types text/plain application/xml; 8.https服務模塊(ngx_http_ssl_module) ssl on | off; 開啟/關閉ssl服務 例: server { listen 443 ssl; server_name www.hhh.com; root /nginx/test2/; access_log /var/log/nginx/ssl_access.log main; ssl on; ssl_certificate /etc/pki/nginx/server.crt; #證書存放路徑 ssl_certificate_key /etc/pki/nginx/private/server.key; #私鑰存放路徑 ssl_session_cache shared:SSL:1m; #在各worker之間啟用大小為1m的共享緩存,可提高緩存利用率,1m可緩存4000個回話 ssl_protocols sslv3 TLSv1 tlsv1.1 tlsv1.2; #設置支持的ssl協議 ssl_session_timeout 10m; #設置共享緩存的超時時間 9.nginx URL重寫模塊,rewrite模塊(ngx_http_rewrite_module) 根據用戶請求的URL按一定規則進行重新替換或定向,使用戶請求跳轉至規則定制的URL 例:server { server_name www.fff.com; location /alais/ { alias /nginx/ta/; index index.html index.htm; rewrite /(.*)\.png$ http://www.fff.com/$1.jpg; #將用戶輸入以.png結尾的請求全部替換為.jpg結尾的請求 rewrite /(.*)$ https://www.fff.com/$1; #將用戶請求全部重寫為https協議並返回請求 } } rewrite規則默認會自上而下一次匹配執行,當第一條rewrite執行後,會將新URL再重新在location中檢查一遍,直到沒有匹配的rewrite, 這樣可能會產生死循環,因為rewrite結尾默認有一個last標識,也可在結尾改為其他標識實現不提功能 1.last #只要有新URL就會使用此標識結尾的規則檢查一次 2.break #檢查若匹配就執行並不再執行後面的rewrite規則 3.redirect #反饋給用戶302響應碼並將新定向的URL,讓客戶端自己請求新定向的URL 4.permanent #與redirect不同的是,permanent是永久重定向 10.防盜鏈模塊(ngx_http_referer_module) **#再打開某些網站時,會出現類似"此圖片僅允許xx網內部使用"的圖片提示,這就是基於此模塊來實現防盜鏈的一種方法 valid_referers none | blocked | server_names | string ...; 定義referer首部的合法可用值; none:請求報文首部沒有referer首部; blocked:請求報文的referer首部沒有值; server_names:參數,其可以有值作為主機名或主機名模式; arbitrary_string:直接字符串,但可使用*作通配符; regular expression:被指定的正則表達式模式匹配到的字符串;要使用~打頭,例如 ~.*\.magedu\.com; 例: valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.; if($invalid_referer) { return http://www.magedu.com/invalid.jpg;
nginx作為http服務器常用模塊