關於nginx的一些常用配置...
Nginx (engine x) 是一個高效能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。
公共配置
1、併發連線配置
1.1 worker_processes
nginx執行工作程序個數,一般設定cpu的核心或者核心數x2。
nginx.conf配置檔案中,設定:worker_processes 4。
worker_processes最多開啟8個,8個以上效能提升不會再提升了,而且穩定性變得更低,所以8個程序夠用了。
1.2 worker_cpu_affinity
nginx預設是沒有開啟利用多核cpu的配置的。需要通過增加worker_cpu_affinity配置引數來充分利用多核cpu,cpu是任務處理,當計算最費時的資源的時候,cpu核使用上的越多,效能就越好。
使用方法和範例:
2核cpu,開啟2個程序
worker_processes 2;
worker_cpu_affinity 01 10;
4cpu,開啟4個程序 worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
1.3 worker_rlimit_nofile
這個指令是指當一個nginx 程序開啟的最多檔案描述符數目,理論值應該是最多開啟檔案數(ulimit -n)與nginx 程序數相除,但是nginx 分配請求並不是那麼均勻,所以最好與ulimit -n (ulimit -n 65535可設定最大開啟檔案數為65535)的值保持一致。
現在在Linux 2.6核心下開啟檔案開啟數為65535,worker_rlimit_nofile就相應應該填寫65535。實際我們填入一個65535,足夠了,一個網站的併發達到這麼大的數量,也算一個大站了!
1.4 work_connections
work_connections是單個worker程序允許客戶端最大連線數,這個數值一般根據伺服器效能和記憶體來制定.
nginx作為http伺服器的時候:max_clients = worker_processes * worker_connections
Web伺服器
相比 Apache,Nginx 使用更少的資源,支援更多的併發連線,體現更高的效率,這點使 Nginx 尤其受到虛擬主機提供商的歡迎。能夠支援高達 50,000 個併發連線數的響應,感謝 Nginx 為我們選擇了 epoll and kqueue 作為開發模型.
listen:表示當前的代理伺服器監聽的埠,預設的是監聽80埠。注意,如果我們配置了多個server,這個listen要配置不一樣,不然就不能確定轉到哪裡去了。
server_name:表示監聽到之後需要轉到哪裡去,這時我們直接轉到本地,這時是直接到nginx資料夾內。
location:表示匹配的路徑,這時配置了/表示所有請求都被匹配到這裡
root:裡面配置了root這時表示當匹配這個請求的路徑時,將會在這個資料夾內尋找相應的檔案,這裡對我們之後的靜態檔案伺服很有用。
index:當沒有指定主頁時,預設會選擇這個指定的檔案,它可以有多個,並按順序來載入,如果第一個不存在,則找第二個,依此類推。
location:分為普通匹配以及正則匹配。
普通匹配,包括:^~(把這個字首用於一個常規字串,如果路徑匹配那麼不測試正則表示式)、 = (精確匹配)、無字首。
普通匹配,遵循最長匹配規則,假設一個請求匹配到了兩個普通規則,則選擇匹配長度大的那個,一般情況下普通匹配成功後,還是會繼續正則匹配,一旦正則匹配也匹配成功後,以正則匹配為準。但是^~和=除外,即^~和=匹配成功後,不再繼續正則匹配。
正則 location:~ (區分大小寫)、~*(不區分大小寫) 。
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* .(gif|jpg|jpeg)$ {
[ configuration E ]
}
“/”請求會匹配到A,精確匹配。
“/index.html”會匹配到B,
“/documents/document.html”請求會匹配到C,
“/images/1.gif”會匹配到D,
“/documents/1.jpg”會匹配到E。
location裡還可新增try_files: $uri $uri/ /index.html。依次按照順序檢查檔案是否存在.
反向代理和域名轉發
反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器。
user www www;
worker_processes 1;
error_log logs/error.log;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
#Nginx事件處理模型
events {
use epoll; #nginx採用epoll事件模型,處理效率高
worker_connections 65535;
multi_accept on;#預設是on,設定為on後,多個worker按序列方式來處理連線,也就是一個連線只有一個worker被喚醒,其他的處於休眠狀態,設定為off後,多個worker按並行方式來處理連線,也就是一個連線會喚醒所有的worker,直到連線分配完畢,沒有取得連線的繼續休眠。當你的伺服器連線數不多時,開啟這個引數會讓負載有一定的降低,但是當伺服器的吞吐量很大時,為了效率,可以關閉這個引數。
}
http {
include mime.types;
default_type application/octet-stream;
include /usr/local/nginx/conf/reverse-proxy.conf;
sendfile on;#//開啟高效檔案傳輸模式,sendfile指令指定nginx是否呼叫sendfile函式來輸出檔案,對於普通應用設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設定為off,以平衡磁碟與網路I/O處理速度,降低系統的負載。
keepalive_timeout 65;#客戶端連線保持會話超時時間,超過這個時間,伺服器斷開這個連結
gzip on;
client_max_body_size 50m; #緩衝區代理緩衝使用者端請求的最大位元組數,可以理解為儲存到本地再傳給使用者
client_body_buffer_size 256k;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
proxy_connect_timeout 300s; #nginx跟後端伺服器連線超時時間(代理連線超時)
proxy_read_timeout 300s; #連線成功後,後端伺服器響應時間(代理接收超時)
proxy_send_timeout 300s;
proxy_buffer_size 64k; #設定代理伺服器(nginx)儲存使用者頭資訊的緩衝區大小
proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設定
proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #設定快取資料夾大小,大於這個值,將從upstream伺服器傳遞請求,而不緩衝到磁碟
proxy_ignore_client_abort on; #不允許代理端主動關閉連線
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
內利用反向代理做負載均衡
upstream www.lcapi.com{
server localhost:8080;
server localhost:9080;
}
server{
listen 80;
autoindex on;
server_name www.lcapi.com;
access_log /usr/local/nginx/logs/access.log combined;
index index.html index.htm index.jsp index.php;
#error_page 404 /404.html;
if ( $query_string ~* ".*[;'<>].*" ){
return 404;
}
location / {
proxy_pass http://www.lcapi.com;
add_header Access-Control-Allow-Origin *;
}
}
我們在server外添加了一個upstream,而直接在proxy_pass裡面直接用http://+upstream的名稱來使用。upstream中的server元素必須要注意,不能加http://,但proxy_pass中必須加。
1)輪詢(預設)
預設選項,當weight不指定時,各伺服器weight相同, 每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
upstream www.lcapi.com{
server localhost:8080;
server localhost:9080;
}
2)weight
指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。如果後端伺服器down掉,能自動剔除。 比如下面配置,則1.11伺服器的訪問量為1.10伺服器的兩倍(後端節點中配置高的伺服器可以適當將weight設定大點)。
upstream www.lcapi.com{
server 192.168.1.10 weight=1;
server 192.168.1.11 weight=2;
}
3)ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session不能跨伺服器的問題,實現session共享。如果後端伺服器down掉,要手工處理。
upstream resinserver {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
4)url_hash
5)fair(第三方)
實戰應用
使用Nginx本地搭建自己的本地圖片伺服器,上傳到相應目錄,用於開發過程中啟動tomcat圖片丟失的問題,後期上傳到伺服器,要改用ftp上傳。
注意:此處要在D盤目錄下建立 D:\\olife\\uploadfiles夾,上傳到此處,不然會訪問不到的。
nginx.conf配置
location ^~ /uploadfiles/ {
expires 24h;
root D:\\olife\\;#指定圖片存放路徑
access_log D:\\logs\\images.log;#日誌存放路徑
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path D:\\olife\\;#圖片訪問路徑
proxy_redirect off;
proxy_set_header Host 127.0.0.1;
client_max_body_size 10m;
client_body_buffer_size 1280k;
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 40k;
proxy_buffers 40 320k;
proxy_busy_buffers_size 640k;
proxy_temp_file_write_size 640k;
if ( !-e $request_filename)
{
proxy_pass http://127.0.0.1:8091;#預設80埠
}
}