【nginx】的基本使用
常用命令:
【-c】指定配置文件:如果不指定會限制默認路徑為(編譯時執行的路徑):/etc/nginx/nginx.conf
【-s】向master發送信號,平滑讀取配置文件,如果配置文件改變了,對當前連接沒有影響,新的連接請求都是以新的配置文件
【-t】能夠測試主配置文件有沒有語法錯誤。
【】
nginx的配置:
【正常運行的必備配置:】
1、user username [groupname]
指定運行worker進程的用戶和組(可以在編譯時指定)
2、pid /path/to/pifile_name;
指定nginx的pid文件
3、worker_rlimit_nofile #;
指定一個worker進程 所能夠打開的最大文件句柄數:
4、worker_rlimit_sigpending #;
設定每個用戶能夠發往worker進程的信號的數量
【優化性能相關的配置:】
1、worker_processes #;
worker進程的個數;通常其數值應該為cpu的物理核心數減1
2、worker_cpu_affinity cpumask ...;
0000(cpu的掩碼)//指定進程只能運行在那些cpu上
0001
0010
(假如有8顆cpu的核心)
例如:worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000
3、ssl_engin device; //與硬件加速相關
在存在ssl硬件加速器的服務器上,指定所使用的ssl硬件加速設備
4、timer_resolution t;
每次內核事件調用返回時,都會使用gettimeofday()來更新nginx緩存時鐘:
timer_resolution用於定義每隔多久才會由gettimeofday()更新一次緩存時鐘;
目前x86-64系統上,gettimeofday()代價已經很小,可以忽略此配置。
5、worker_priority number;
優先級 {-20,19}之間的值:
【事件相關的配置】
1、accept_mutex [on|off]
表示是否打開自旋鎖
是否打開Ningx的負載均衡鎖,此鎖能夠讓多個worker進程輪流的、序列化地與新的客戶端建立連接:
而通常當一個worker進程的負載達到其上限的7/8,master就盡可能不再將請求調度此worker;
2、lock_file
/path/to/lock_file;
lock(鎖)文件
3、accept_mutex_delay #ns;
accept鎖模式中,一個worker進程為取得accept鎖的等待時長:如果某個worker進程在某次試圖取得鎖時失敗了,至少要等待#ms才能再一次請求鎖;默認是500毫秒
注意:使用accept鎖後,在同一時間只能有一個worker進程使用這個鎖
4、multi_accept {on|off};
是否允許一次性地響應多個用戶請求;默認為off
5、use [epoll|rtsig|select|poll]
定義使用的事件模型,建議讓nginx自動選擇;
6、worker_connections #;
每個worker能夠並發響應最大請求數;
【用於調試、定位問題:只調試nginx時使用】
1、daemon [on|off];
是否讓nginx運行後台:默認為on,調試時可以設置為off,使用所有信息去輸出控制台;
2、master_process [on|off];
是否以master/worker模式運行nginx:默認為on;調試可以設置為off以方便追蹤;
3、error_log /path/to/error_log level;
錯誤日志文件及其級別:默認為error級別;調試時可以使用debug級別,但要求在編譯時必須使用--with-debug啟用debug功能:
【nginx的http功能:】
必須使用虛擬機來配置站點:每一個虛擬主機使用一個server{}段配置:
server{}
非虛擬主機的配置或公共配置,需要定義在server之外,http之內;
http{
directive value;
.....
server{
....
}
server{
....
}
}
1、server{}
定義一個虛擬主機:nginx支持使用基於主機名或IP的虛擬主機:
2、listen
三種方式監聽:
listen address[:port];監聽指定地址的指定端口
listen port;監聽所有地址的指定端口
listen unix:socket_file_path
監聽語法:
listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport]
[so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
參數說明:
【default_server】:定義server為http中默認的server;如果所有的server中沒有任何一個listen使用此參數,那麼第一個server即為默認server
【rcvbuf=SIZE】接收緩存大小:SIZE
【sndbuf=SIZE】發送緩存大小:
【ssl: https server】建立連接時必須使用ssl
3、server_name [...];
server_name可以跟多個主機名:當nginx收到一個請求時,會使用其首部的server的值,而後跟眾server_name進行比較:
比較法方式:
(1)先做精確匹配:www.magedu.com
(2)左側通配符匹配:*.magedu.com
(3)右側通配符配置:www.*
(4)正則表達式匹配:~^.*\.magedu\.com$
4、server_name_hash_backet_size [32|64|128];
為了實現快速主機查找,nginx使用hash表示來保存主機名:
5、location URI
官方語法:
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
功能:允許根據用戶請求的URI來匹配指定的各location以進行訪問配置:
匹配到時,將location塊中的配置所處理:
參數說明:
【=】精確匹配
【~】正則表達式模式匹配,匹配時區分字符大小寫
【~*】正則表達式模式匹配,匹配時忽略字符大小寫
【^~】URI前半部分匹配,不檢查正則表達式
匹配優先級:
字符字面量最精確匹配、正則表達式檢索(由第一個匹配到所處理)、按字符字面量
【文件路徑定義】
1、root path
設置web資源路徑:用於指定請求的根文檔目錄:
例如:
location / {
root /www/htdocs;//跳轉目錄後為:/www/htdocs/..
}
location ^~ /images/ {
root /web;
//跳轉的後為:/web/images/...
}
2、alias path
指定路徑別名,只能用於location中,用於路徑別名:
例如:
location / {
root /www/htdocs;//跳轉目錄後為:/www/htdocs/..
}
location ^~ /images/ {
alias /web;
//跳轉的後為:/web/... (相當於將匹配到的目錄替換為指定目錄)
}
3、index file ...;
定義默認頁面,可以參跟多個值:
4、error_page code ... [=[response]] uri;
當對於某個請求返回錯誤時,如果匹配上了error_page指令中設定的code,則重定向到新的URI中。
錯誤頁面重定向;
例如:error_page 404 =200 /404.html; 其中的=200是重新定義狀態碼, /404.html是重新跳轉的頁面
5、try_files path1 [path2 ...] uri;
從左至右嘗試讀取由path所指定路徑,在第一次找到即停止並返回:如果所有path均不存在,則返回最後一個url;
檢查指定的順序中的文件是否存在,並使用第一個找到處理的文件,在當前上下文中進行處理。
文件的路徑是從文件參數的根和別名命令的。可以通過指定在名字的最後一個斜槓檢查目錄的存在,例如“$ URI /”。如果該文件沒有被發現,在最後一個參數指定的URI內部重定向了。
例如:
location /documents {
try_files $uri /temp.html;
}
location ~* ^/documents/(.*)$ {
root /www/htdocs;
try_files $uri /docu/$1 /temp.html; #這個當訪問路徑為:http://www.magedu.com/documents/a.html是,
#依次尋找的路徑為【www.magedu.com/www/htdocs/documents/a.html】
【www.magedu.com/www/htdocs/docu/a.html】
【www.magedu.com/www/htdocs/temp.html】
}
【網絡連接相關的設置:】
1、keepalive_timeout time;
保持連接的超時時間:默認為75秒
2、keepalive_requests n;
在一次長連接上允許承載的最大請求數;
3、keepalive_disable [msie6 | safari | none]
對指定的浏覽器禁止使用長連接;
4、tcp_nodelay on|off
對keepalive連接是否使用TCP_NODELAY選項;
默認是on ,通常也是on
5、client_header_timeout time;
讀取http請求首部的超時時長;
默認是60s
6、client_body_timeout time;
讀取http請求包體的超時時長;
默認是60s
7、send_timeout time;
發送響應的超時時長:
【對客戶端請求的限制:】
1、limit_except sethod ... {...}
指定對范圍之外的方法的訪問控制
例如:
limit_except GET {
allow 172.16.0.0/16;
deny all;
}-------------------------------》表示除了get方法之外的其他方法要想使用必須要滿足{}裡面的要求
2、client_max_body_size SIZE;
http請求包體的最大值;常用於限定客戶端所能夠請求的最大包體;根據請求首部中的Content-Length來檢測,以避免無用的傳輸:
3、limit_rate speed;
限制客戶端每秒鐘傳輸的字節數:默認為0,表示沒有限制:
4、limit_rate_after time;
nginx向客戶端發送響應報文時,如果時長超出了此處指定的時長,則後續的發送過程開始限速:
【文件操作的優化】
1、sendfile on|off
是否啟用sendfile功能:
2、aio on|off
是否啟用aio
3、open_file_cache max=N [inactive=time]|off
是否打開文件緩存功能:
max:緩存條目的最大值:當滿了以後將根據LRU算法進行置換;
inactive:某緩存條目在指定時長內沒有被訪問過時,將自動被刪除:默認為60s 如果使用off表示關閉。
緩存的信息包括:
文件句柄、文件大小和上次修改時間:
已經打開的目錄結構:
沒有找到或沒有訪問權限的信息:
4、open_file_cache_errors on|off
是否緩存文件找不到或沒有權限訪問等相關信息:
5、open_file_cache_valid time;
多長時間檢查一次緩存中的條目是否超出非活動時長,默認為60s
6、open_file_cache_min_use #;
在inactive指定的時長內被訪問超出此處指定的次數時,才不會被刪除;
【對客戶的請求的特殊處理】
1、ignore_invalid_headers on|off
是否忽略不合法的http首部:默認為on;off意味著請求首部中出現不合規的首部將拒絕響應;只能用於server和http;
2、log_not_found on|off
是否將文件找不到的信息也記錄進錯誤日志中;
3、resolver address;
指定nginx使用的dns服務器地址:
4、resover_timeout time;
指定DNS解析超時時長,默認為30s;
5、server_tokens on|off
是否在錯誤頁面中顯示nginx的版本號
【http核心模塊的內置變量:】
【$uri】當前請求的uri,不帶參數:
【$request_uri】請求的uri,帶完整參數;
【$host】http請求報文中host首部:如果請求中沒有host首部,則以處理此請求的虛擬主機的主機名代替
【$hostname】nginx服務運行在主機的主機名;
【$remote_addr】客戶端IP
【$remote_port】客戶端Port
【$remote_user】使用用戶認證時客戶端輸入的用戶名:
【$request_filename】用戶請求中的URI經過本地root或alias轉換後映射的本地的文件路徑;
【$request_method】請求方法
【$server_addr】服務器地址
【$server_name】服務器名稱
【$server_port】服務器端口
【$server_protocol】服務器向客戶端發送響應時的協議,比如http/1.1,http/1.0
【$scheme】在請求中使用scheme,比如https://www.magedu.com/中的https:
【$http_HEADER】(HEADER需要自己修改,修改成你指定匹配的HEADER)匹配請求報文中指定的HEADER,$http_host匹配請求報文中的host首部
【$sent_http_HEADER】(HEADER需要自己修改,修改成你指定匹配的HEADER)匹配響應報文中指定的HEADER,例如$http_content_type匹配響應報文中的content-type首部;
【$document_root】當前請求映射到的root配置:
【$status】引用狀態碼
【$bytes_send】發送的字節數
【$http_refere】從哪個頁面跳轉而來的
【$http_user_agent】浏覽器的類型
【$gzip_ratio】gzip的壓縮比例
【配置使用nginx】
1.nginx虛擬主機
server{
listen
#設置監聽的端口
server_name
#設置訪問域名
root #設置網站的資源路徑
}
2、訪問控制access模塊(基於IP)
allow #允許通過的
deny #不許通過的
3、用戶認證示例
location /admin/ {
root /www/b.org;#跳轉目錄
auth_basic "admin area";
auth_basic_user_file /etc/nginx/.htpasswd; #指定驗證用戶名密碼的密碼文件
}
注意:在文件指定後,還有創建相應的文件,使用
#htpasswd -c -m /etc/nginx/.htpasswd tom #創建文件,並寫入用戶tom和密碼(首次需要-c)
#htpasswd -m /etc/nginx/.htpasswd gandian #再次在該文件中添加一個用戶和密碼
4、建立下載站點時用到的模塊autoindex
示例:
location /download/ {
root /www/b.org;
autoindex on;#開啟目錄浏覽
}
5、防盜鏈
(1)定義合規的引用
valid_referers none | blocked | server_names | string ...;
(2)拒絕不合規的引用
if($invalid_referer){
rewrite
^/.*$ http://www.b.org/403.html
}
6、URI rewrite
rewrite regex replacement [flag];
location /{
root /www/b.org;
rewrite ^/images/(.*)$ /imgs/$1; #http://www.b.org/images/a.jpg --->http://www.b.org/imgs/a.jpg
rewrite ^/imgs/(.*)$ /images/$1 last;
}
【last】一旦被當前規則匹配並重寫後立即停止檢查後續的其他rewrite的規則,而通過重寫後的規則重新發起請求;
【break】一旦被當前規則匹配並重寫立即停止後續的其他rewrite的規則,而後繼續由nginx進行後續操作
【redirect】返回302臨時重定向
【permanent】返回301永久重定向。
例如:
location /download/ {
root /www/b.org;
autoindex on;
rewrite ^/download/(.*\.(jpg|gif|jpeg|png))$ /images/$1 last;
}
注意:nginx最多循環10次,超出之後會返回500錯誤;
一般將rewrite寫在location中時都使用break標志,或者將rewrite寫在if上下文中
rewrite_log
是否把重寫過程記錄在錯誤日志中:默認為notice級別: 默認為off;
例如:error_log /var/log/nginx/error.log notice;
return_code:
用於結束rewrite規則,並且為客戶端返回狀態碼:可以使用的狀態碼有:204,400,402-406,500-504等;
if條件語句
if(condition){
}
7、壓縮
nginx將響應報文發送至客戶端之前可以啟用壓縮功能,這能夠有效地節約寬帶,並提高響應至客戶端的速度。通常編譯nginx默認會附帶gzip壓縮的功能,因此可以直接啟用之。
http{
gizp on;
#開啟nginx的gizp壓縮功能
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain text/css application/x-javascript text/xml aplication/xml application/xml+rss text/javascript application/javascript application/json; #設置需要壓縮的文件類型
gzip_disable msie6;
}
gzip_proxied指令可以定義客戶端請求哪類對象啟用壓縮功能,如“expired”表示對由於使用了expire首部定義而無法緩存的對象啟用壓縮功能,其它可接受的值還有
“no-cache”、“no-store”、“private”、“no_last_modified”、“no_etag”等,而“off”則表示關閉壓縮功能。
-----附件:安裝步驟------------------
首先添加用戶nginx,實現以之運行nginx服務器
#groupadd -r nginx
#useradd -r -g nginx nginx
接著開始編譯和安裝
# ./configure \
--prefix=/usr \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.lock \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/uwsgi \
--with-pcre
#make && make install
說明:
1.Nginx可以使用Tmalloc(快速、多線程的malloc庫及優秀性能分析工具)來加速內存分配,使用此功能需要事先安裝gperftools,而後在編譯nginx添加--with-google_perftools_module選項即可。
2.如果想使用nginx的perl模塊,可以通過configure腳本添加--with-http_perl_module選項來實現,但目前此模塊仍處於實驗性使用階段,可能會在運行時出錯,因此,其實現方式這裡不再介紹。如果想使用基於nginx的cgi功能,也可以基於FCGI來實現,具體實現方法請參照網上的文檔。
3.為nginx提供Sysv init腳本:
----------------------------------------------------end-------------