一. ngnix用途
1. Web 服務器:
相比 Apache,Nginx 使用更少的資源,支持更多的併發連接,體現更高的效率,這點使 Nginx 尤其受到虛擬主機提供商的歡迎。能夠支持高達 50,000 個併發連接數的響應,感謝 Nginx 爲我們選擇了 epoll and kqueue 作爲開發模型.
2.負載均衡服務器
支持作爲 HTTP代理服務器對外進行服務。Nginx用C編寫,不論是系統資源開銷還是 CPU 使用效率都比 Perlbal 要好的多。
3.作爲郵件代理服務器
Nginx 同時也是一個非常優秀的郵件代理服務器(最早開發這個產品的目的之一也是作爲郵件代理服務器),Last.fm 描述了成功並且美妙的使用經驗.
4.優勢
安裝非常的簡單,配置文件 非常簡潔(還能夠支持perl語法),Bugs非常少的服務器, Nginx 啓動特別容易,並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啓動。你還能夠在 不間斷服務的情況下進行軟件版本的升級。
Nginx配置詳解
一、Nginx簡介
Nginx是俄羅斯人編寫的十分輕量級的HTTP服務器,Nginx,它的發音爲“engine X”,是一個高性能的HTTP和反向代理服務器,同時也是一個IMAP/POP3/SMTP 代理服務器。
Nginx以事件驅動的方式編寫,所以有非常好的性能,同時也是一個非常高效的反向代理、負載平衡。
Nginx因爲它的穩定性、豐富的模塊庫、靈活的配置和低系統資源的消耗而聞名.業界一致認爲它是Apache2.2+mod_proxy_balancer的輕量級代替者,不僅是因爲響應靜態頁面的速度非常快,而且它的模塊數量達到Apache的近2/3。對proxy和rewrite模塊的支持很徹底,還支持mod_fcgi、ssl、vhosts ,適合用來做mongrel clusters的前端HTTP響應。
Nginx專爲性能優化而開發,可以支持高併發連接
性能是其最重要的考量,實現上非常注重效率,處理響應請求很快 。它支持內核Poll模型,能經受高負載的考驗,有報告表明能支持高達 50,000個併發連接數。
Nginx具有很高的穩定性。
其它HTTP服務器,當遇到訪問的峯值,或者有人惡意發起慢速連接時,也很可能會導致服務器物理內存耗盡頻繁交換,失去響應,只能重啓服務器。例如當前apache一旦上到200個以上進程,web響應速度就明顯非常緩慢了。而Nginx採取了分階段資源分配技術,使得它的CPU與內存佔用率非常低。nginx官方表示保持10,000個沒有活動的連接,它只佔2.5M內存,所以類似DOS這樣的攻擊對nginx來說基本上是毫無用處的。就穩定性而言,nginx比lighthttpd更勝一籌。
Nginx支持熱部署。
它的啓動特別容易, 並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啓動。你還能夠在不間斷服務的情況下,對軟件版本進行進行升級。
Nginx配置簡單,只需要修改conf下的nginx.conf文件就行,也就幾十行配置,簡單的十幾行就能搞定。
啓動和停止Nginx
Nginx目前只支持命令行操作,進入Nginx部署目錄。
1) 啓動Nginx:start nginx
2) 停止Nginx:nginx -s stop
3) 修改配置後重啓:nginx -s reload
二、nginx.conf 配置文件
Nginx 配置文件主要分成四部分:main(全局設置)、http(HTTP 的通用設置)、server(虛擬主機設置)、location(匹配 URL 路徑)。還有一些其他的配置段,如 event,upstream 等。
1、 通用設置
user nginx
指定運行 nginx workre 進程的用戶和組
worker_rlimit_nofile #
指定所有 worker 進程能夠打開的最大文件數
worker_cpu_affinity
設置 worker 進程的 CPU 粘性,以避免進程在 CPU 間切換帶來的性能消耗。如 worker_cpu_affinity 0001 0010 0100 1000;(四核)
worker_processes 4
worker 工作進程的個數,這個值可以設置爲與 CPU 數量相同,如果開啓了 SSL 和 Gzip,那麼可以適當增加此數值
worker_connections 1000
單個 worker 進程能接受的最大併發連接數,放在 event 段中
error_log logs/error.log info
錯誤日誌的存放路徑和記錄級別
use epoll
使用 epoll 事件模型,放在 event 段中
2、 http 服務器配置
server {}:
定義一個虛擬主機
listen 80;
定義監聽的地址和端口,默認監聽在本機所有地址上,該端口不能被其他程序佔用,否則啓動不了,最開始80開始的端口。
server_name NAME [...];
定義虛擬主機名,可以使用多個名稱,還可以使用正則表達式或通配符。
sendfile on
開啓 sendfile 調用來快速的響應客戶端
keepalive_timeout 10
長連接超時時間,單位是秒。
send_timeout
指定響應客戶端的超時時間
client_max_body_size 10m
允許客戶端請求的實體最大大小
root PATH
設置請求 URL 所對應資源所在文件系統上的根目錄
location [ = | ~ | ~* | ^~ ] URI { ... }
設置一個 URI 匹配路徑
=:精確匹配
~:正則表達式匹配,區分字符大小寫
~*:正則表達式匹配,不區分字符大小寫
^~:URI 的前半部分匹配,且不實用正則表達式
優先級:
= > location 完整路徑 > ^~ > ~ > ~* > location 起始路徑 > location /
allow 和 deny
基於 IP 訪問控制,如:
僅允許 192.168.0.1/192.168.255.255 網段客戶端訪問
allow 192.168.0.1/192.168.255.255;
deny all;
rewrite <REGEX> <REPL> <FLAG>
URL 重寫,可以使用多種標記
例如:
rewrite ^/images/(.*\.jpg)$ /imgs/$1 break;
可用的 flag:
- last:重寫完成後,繼續匹配其他 rewrite 規則
- break:重寫完成後不再繼續匹配
- redirect:返回 302 重定向(臨時重定向),客戶端對重定向的 URL 發起新的請求
- permanent:返回 301 重定向(永久重定向),客戶端對重定向的 URL 發起新的請求
當我們把前段工程放到nginx的html目錄下的時候,我們訪問前段工程的時候就需要使用到URL的重寫
例如:我們的工程項目叫test,主頁面是test目錄下的index.html頁面。
配置如下:
location/{
rewrite "^/home/(.+)" /test/$1 last;
}
當我們訪問主頁面的時候使用127.0.0.1:80/home/index.htnl就OK了。
三、反向代理配置
修改部署目錄下conf子目錄的nginx.conf文件(如nginx/conf/nginx.conf)內容,可調整相關配置。
反向代理配置示例:
在對應的Server裏面添加如下配置
location / {#默認的/是指根目錄。如果需要配置其他反向代理的路徑,可以是根路徑 location /test
#禁用緩存
proxy_buffering off;
#設置反向代理的地址
#代理的可以是單獨的地址,也可以加端口號,還可以加對應的路徑比如http://192.168.1.1:8080/test
proxy_pass http://192.168.1.1;
}
四、負載均衡配置
1、RR(默認)權重輪詢
每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。
例如:
upstream tomcats {
server 192.168.1.1:8080 max_fails=3 fail_timeout=3s weight=9;
server 192.168.1.2:8080 max_fails=3 fail_timeout=3s weight=1;
}
那麼10次一般只會有1次會訪問到8080,而有9次會訪問到8080
2、ip_hash
上面的2種方式都有一個問題,那就是下一個請求來的時候請求可能分發到另外一個服務器,當我們的程序不是無狀態的時候(採用了session保存數據),這時候就有一個很大的很問題了,比如把登錄信息保存到了session中,那麼跳轉到另外一臺服務器的時候就需要重新登錄了,所以很多時候我們需要一個客戶只訪問一個服務器,那麼就需要用iphash了,iphash的每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。
upstream test {
ip_hash;
server 192.168.1.1:8080;
server 192.168.1.2:8080;
}
3、fair(第三方)
需要安裝第三方的fair插件才能配置使用
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream backend {
fair;
server 192.168.1.1:8080;
server 192.168.1.2:8080;
server 192.168.1.3:8080 backup;#設置爲備用主機
}
4、url_hash(第三方)
需要安裝第三方的url_hash插件才能配置使用
按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。 在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法
upstream backend {
hash $request_uri;
hash_method crc32;
server 192.168.1.1:8080;
server 192.168.1.2:8080;
}
每個設備的狀態設置爲:
1.down 表示單前的server暫時不參與負載
2.weight 默認爲1.weight越大,負載的權重就越大。
3.max_fails :允許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤
4.fail_timeout:max_fails次失敗後,暫停的時間。
5.backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。
要注意的是 weight 與 ip_hash 是不能同時使用的,原因很簡單,他們是不同且彼此衝突的策略。
以上4種負載均衡各自適用不同情況下使用,所以可以根據實際情況選擇使用哪種策略模式,不過fair和url_hash需要安裝第三方模塊才能使用。
下面是一個完整的nginx的配置樣例:
#user nginx;#windows下可以不配置,但是linux下必須配置,不然沒有訪問權限。你使用用戶nginx啓動nginx,就配置爲user nginx
worker_processes 8;#工作線程數量,可以配置爲CPU的數量
error_log logs/error.log;#錯誤日誌輸出文件
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;#指定進程ID,方便在部署環境的時候寫腳本去管理進程
events {
worker_connections 1024;#配置的最大併發連接數量
}
upstream tomcats {
server 192.168.1.1:8080 max_fails=3 fail_timeout=3s weight=9;
server 192.168.1.2:8080 max_fails=3 fail_timeout=3s weight=1;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;#運行日誌,默認在這個日誌文件,可以修改。
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;#設置連接超時時間
#gzip on;
#配置一個虛擬的server服務器
server {
listen 8880;#監聽端口
server_name localhost;#主機名稱
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
proxy_pass http://tomcats;
index index.html index.htm;
}
location /home {
rewrite "^/home/(.+)" /test/$1 last;
}
location /Test {
proxy_pass http://192.168.1.1:8080/TestServlet;
}
#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;
}
}
include servers/*;
}