nginx可做爲Web和 反向代理 服務器,在高鏈接併發的狀況下,Nginx是Apache服務器不錯的替代品。下面記錄一下本身對nginx的配置和使用。javascript
nginx的安裝
-
環境:oracle-linux7css
-
安裝依賴html
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre
- 安裝nginx
yum -y install nginx # 可能找不到安裝包,須要源碼安裝
# 源碼安裝,在合適的目錄下 wget http://nginx.org/download/nginx-1.10.2.tar.gz tar zxvf nginx-1.10.2.tar.gz cd nginx-1.10.2 mkdir /usr/local/nginx # 生成配置文件 ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module make && make install # 設置軟鏈接 ln -s /usr/local/nginx/sbin/nginx /usr/bin/
啓動測試
cd /usr/local/nginx/sbin/ nginx # 啓動,默認是在後臺運行,不會阻塞當前的終端 ps aux | grep nginx # 有兩個進程 nginx: master process nginx nginx: worker process
經常使用的命令
nginx -h # 幫助 nginx -t # 驗證配置文件的正確性 nginx -v # 查看nginx的版本 nginx -c filename # 按指定的配置文件啓動,默認的路徑conf/nginx.conf nginx -s reload # 從新載入配置文件 nginx -s reopen # 重啓nginx nginx -s stop # 關閉nginx nginx -s quit # 退出
nginx的配置文件的詳解
- nginx的配置分爲四個部分:main(全區設置),server(主機配置),upstream(負載均衡服務器設置),和location(URL匹配特定位置設置)。
#運行用戶 user nobody; #pid文件 pid logs/nginx.pid; #==worker進程數,一般設置等同於CPU數量,auto爲自動檢測 worker_processes auto; #==worker進程打開最大文件數,可CPU*10000設置 worker_rlimit_nofile 100000; #全局錯誤日誌 error_log logs/error.log; # error_log logs/error.log info; # 能夠設置級別 # 設置前臺運行,默認後臺運行 daemon off; #events模塊中包含nginx中全部處理鏈接的設置 events { #==worker進程同時打開的最大鏈接數,可CPU*2048設置 worker_connections 2048; #==告訴nginx收到一個新連接通知後接受盡量多的連接 multi_accept on; #==設置用於複用客戶端線程的輪訓方法 use epoll; } #http模塊控制着nginx http處理的全部核心特性 http { #打開或關閉錯誤頁面中的nginx版本號deng server_tokens on; #!server_tag on; #!server_info on; #==優化磁盤IO設置,指定nginx是否調用sendfile函數來輸出文件,普通應用設爲on,下載等磁盤IO高的應用,可設爲off sendfile on; #==設置nginx在一個數據包裏發送全部頭文件,而不是一個接一個的發送 tcp_nopush on; #==設置nginx不要緩存數據,而是一段一段的發送, #==當須要及時發送數據時,就應該給應用設置這個屬性,這樣發送一小塊數據信息時就不能當即獲得返回值 tcp_nodelay on; #==設置nginx是否存儲訪問日誌,關閉這個可讓讀取磁盤IO操做更快 access_log on; #設置nginx只記錄嚴重錯誤 #error_log logs/error.log crit; #==給客戶端分配keep-alive連接超時時間 keepalive_timeout 30; #設置用戶保存各類key的共享內存的參數,5m指的是5兆 limit_conn_zone $binary_remote_addr zone=addr:5m; #爲給定的key設置最大的鏈接數,這裏的key是addr,設定的值是100,就是說容許每個IP地址最多同時打開100個鏈接 limit_conn addr 100; # 限制下載速度 limit_rate 128k; #include指在當前文件中包含另外一個文件內容 include mime.types; #設置文件使用默認的mine-type default_type text/html; #設置默認字符集 charset UTF-8; #==設置nginx採用gzip壓縮的形式發送數據,減小發送數據量,但會增長請求處理時間及CPU處理時間,須要權衡 gzip on; #==加vary給代理服務器使用,針對有的瀏覽器支持壓縮,有個不支持,根據客戶端的HTTP頭來判斷是否須要壓縮 gzip_vary on; #nginx在壓縮資源以前,先查找是否有預先gzip處理過的資源 #!gzip_static on; #爲指定的客戶端禁用gzip功能 gzip_disable "MSIE[1-6]\."; #容許或禁止壓縮基於請求和相應的響應流,any表明壓縮全部請求 gzip_proxied any; #==設置對數據啓用壓縮的最少字節數,若是請求小於10240字節則不壓縮,會影響請求速度 gzip_min_length 10240; #==設置數據壓縮等級,1-9之間,9最慢壓縮比最大 gzip_comp_level 2; #設置須要壓縮的數據格式 gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss; #==開發緩存的同時也指定了緩存文件的最大數量,20s若是文件沒有請求則刪除緩存 open_file_cache max=100000 inactive=20s; #==指多長時間檢查一次緩存的有效信息 open_file_cache_valid 60s; #==文件緩存最小的訪問次數,只有訪問超過5次的纔會被緩存 open_file_cache_min_uses 5; #當搜索一個文件時是否緩存錯誤信息 open_file_cache_errors on; #==容許客戶端請求的最大單文件字節數 client_max_body_size 8m; #==衝區代理緩衝用戶端請求的最大字節數 client_header_buffer_size 32k; 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; #==nginx跟後端服務器鏈接超時時間(代理鏈接超時) proxy_connect_timeout 60; #==鏈接成功後,後端服務器響應時間(代理接收超時) proxy_read_timeout 120; #==後端服務器數據回傳時間(代理髮送超時) proxy_send_timeout 20; #==設置代理服務器(nginx)保存用戶頭信息的緩衝區大小 proxy_buffer_size 32k; #==proxy_buffers緩衝區,網頁平均在32k如下的設置 proxy_buffers 4 128k; #==高負荷下緩衝大小(proxy_buffers*2) proxy_busy_buffers_size 256k; #==設定緩存文件夾大小,大於這個值,將從upstream服務器傳 proxy_temp_file_write_size 256k; #==1G內存緩衝空間,3天不用刪除,最大磁盤緩衝空間2G proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:1024m inactive=3d max_size=2g; #設定負載均衡服務器列表 upstream nginx.test.com{ #後端服務器訪問規則 #ip_hash; #weight參數表示權重值,權值越高被分配到的概率越大 #server 10.11.12.116:80 weight=5; #PC_Local server 10.11.12.116:80; #PC_Server server 10.11.12.112:80; #Notebook #server 10.11.12.106:80; } #虛擬主機設定模塊(掛載多個站點,只須要配置多個server及upstream節點便可) server { #監聽80端口 listen 80; #定義使用nginx.test.com訪問 server_name nginx.test.com; #設定本虛擬主機的訪問日誌 access_log logs/nginx.test.com.access.log; #默認請求 # 語法規則:location [=|~|~*|^~] /uri/ {...} 先匹配普通location,在匹配正則location # = 開頭表示精確匹配 # ^~ 開頭表示uri以某個常規字符串開頭,理解爲匹配url路徑便可,無需考慮編解碼 # ~ 開頭表示區分大小寫的正則匹配 # ~* 開頭表示不區分大小寫的正則匹配 # !~ 開頭表示區分大小寫的不匹配的正則 # !~* 開頭表示不區分大小寫的不匹配的正則 # / 通用匹配,任何請求都會被匹配到 location / { #限制IP訪問 deny 192.168.0.2; allow 192.168.0.0/24; allow 192.168.1.1; deny all; #定義服務器的默認網站根目錄位置 root html; #定義首頁索引文件的名稱 index index.html index.htm; #定義後端負載服務器組 proxy_pass http://nginx.test.com; } #定義錯誤提示頁面 error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } #靜態文件,nginx本身處理 location ~ ^/(images|javascript|js|css|flash|media|static)/{ root /var/www/virtual/htdocs; #過時時間1天 expires 1d; #關閉媒體文件日誌 access_log off; log_not_found off; } #設定查看Nginx狀態的地址 location /NginxStatus { #!stub_status on; #無此關鍵字 access_log off; auth_basic "NginxStatus"; auth_basic_user_file conf/htpasswd; } #禁止訪問的文件.htxxx location ~ /\.ht { deny all; } } #網站較多的狀況下ngxin又不會請求瓶頸能夠考慮掛多個站點,並把虛擬主機配置單獨放在一個文件內,引入進來 #include website.conf; }
對域名的匹配規則
server_name location; # 匹配本地主機ip; server_name www.baidu.com; # 精確配置 server_name *.baidu.com; # 以通配符開頭的配置 server_name baidu.*; # 以通配符結尾的配置 server_name ~^(?<user>.+)\.example\.net$; #正則的配置,必須以波浪線爲開頭
路由對location的匹配規則
- 貪婪原則:匹配儘量長的路徑;
server { location / { root /data/www; } location /images/ { root /data; } } # /images/匹配到第二個;
- 通配規則
以=開頭,表示精確匹配; 以^~開頭,表示uri以某個常規字符串開頭,不是正則匹配; 以~開頭,表示區分大小寫的正則匹配; 以~*開頭,表示不區分大小寫的正則匹配; /,表示通用匹配, 若是沒有其它匹配,任何請求都會匹配到;java
- 注意
# 若是有兩個開頭同樣的路由,有可能匹配不到 如: location /eeg location /eegabc # 上面會形成/eegabc匹配失敗
nginx的日誌設置規則
- 主要分爲access_log和error_log;
access log : 記錄了哪些用戶,哪些頁面以及用戶瀏覽器、ip和其餘的訪問信息 默認值: access_log logs/access.log combined; # 表示配置的路徑和格式 配置段: http, server, location, if in location, limit_except error log : 記錄服務器錯誤日誌 默認值: error_log logs/error.log error; # 表示配置的路徑和級別,有[debug | info | notice | warn | error | crit | alert | emerg]八個級別; 配置段: main, http, server, location
負載均衡的規則
#設定負載均衡服務器列表 upstream test{ #後端服務器訪問規則 #ip_hash; # 根據ip的hash規則分配,主要是當須要會話保持的時候,session是不能共享的; #weight參數表示權重值,權值越高被分配到的概率越大,服務器的運算能力有時不是同樣的; #server 10.11.12.116:80 weight=5; #PC_Local server 10.11.12.116:80 max_fails=3 fail_timeout=30; # max_fails:最多的轉發失敗的次數,若是轉發失敗超過次數,就認爲該服務器掛掉; # fail_timeout:請求失敗暫停的服務時間,在這個時間內會暫時放棄轉發給該服務器; #PC_Server server 10.11.12.112:80 down; # down:暫時不參與負載均衡; server 10.11.12.112:80 backup; # backup:備用服務器,當其餘全部的機器忙的時候,會啓用備用服務器; }
一份比較經常使用的配置文件
# nginx.conf #user nobody; worker_processes auto; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log main; pid logs/nginx.pid; events { worker_connections 1024; multi_accept on; use epoll; } http { include mime.types; default_type application/octet-stream; access_log logs/access.log main; error_log logs/http/error.log error; client_max_body_size 8m; client_header_buffer_size 32k; large_client_header_buffers 4 64k; sendfile on; tcp_nopush on; #tcp_nodelay on; keepalive_timeout 60; client_header_timeout 10; client_body_timeout 10; gzip on; gzip_buffers 4 16k; server { listen 8000; server_name localhost; #charset koi8-r; access_log logs/host.access.log main; error_log logs/server/error.log error; # root html/umsapp-ota; location / { # allow 192.168.0.0; #deny all; proxy_set_header Host $host; proxy_pass http://192.168.1.22:8000; } location /static { # 配置靜態文件的目錄 alias /usr/local/web/static/ } #location / { # root html; # index index.html index.htm; #} #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }