前言
Nginx是由俄羅斯軟件工程師Igor Sysoev開發的一個高性能的HTTP和反向代理服務器,具備IMAP/POP3和SMTP服務器功能。Nginx最大的特點是對高并發的支持和高效的負載均衡,在高并發的需求場景下,是Apache服務器不錯的替代品。目前,包括新浪、騰訊等知名網站都已使用Nginx作為Web應用服務器。本文帶來的是Nginx配置與應用詳解。
基礎特性
基本功能
靜態資源的web服務器,能緩存打開的文件描述符
反向代理服務器,緩存、負載均衡
支持FastCGI
模塊化,非DSO機制,過濾器gzip,SSI和圖像大小調整等
支持SSL
擴展功能
基于名稱和IP做虛擬主機
支持keepalive
支持平滑配置更新或程序版本升級
定制訪問日志,支持使用日志緩存以提高性能
支持url rewrite
支持路徑別名
支持基于IP及用戶的認證
支持速率限制,并發限制等
基本架構
一個master, 生成一個或多個worker
事件驅動:kqueue, epoll, /dev/poll
消息通知:select, poll, rt signals
支持sendfile, sendfile64
文件AIO
支持mmap
模塊類別
核心模塊
標準http模塊
可選的http模塊
郵件模塊
第三方擴展模塊
基本配置
虛擬主機
[root@node1 ~]# vim /etc/nginx/nginx.conf 注釋掉http{}段中的預先定義的server{}段的所有內容; 在下面添加一條: include extra/nginx-vhost.conf; #個人喜好,也可以直接在 /etc/nginx/nginx.conf中配置 [root@node1 ~]# vim /etc/nginx/nginx-vhost.conf server { listen 80; server_name www.a.com; location / { root /www/a; index index.html index.htm; } } server { listen 80; server_name www.b.net; location / { root /www/b; index index.html index.htm; } }
[root@node1 ~]# echo "www.a.com" > /www/a/index.html [root@node1 ~]# echo "www.b.net" > /www/b/index.html [root@node1 ~]# service nginx start Starting nginx: [ OK ] [root@node1 ~]# vim /etc/hosts 172.16.10.123 www.a.com www.b.net[root@node1 ~]# curl http://www.a.com www.a.com [root@node1 ~]# curl http://www.b.net www.b.net
虛擬主機基本配置完成,當然虛擬主機里也可以有很多參數的,下文會提及到
訪問控制
基于用戶
server { listen 80; server_name www.b.net; location / { auth_basic "Admin Area"; auth_basic_user_file /etc/nginx/.htpasswd; root /www/b; index index.html index.htm; } }
認證文件由htpasswd命令創建
[root@node1 ~]# htpasswd -mc /etc/nginx/.htpasswd tom New password: Re-type new password: Adding password for user tom root@node1 ~]# service nginx reload nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful Reloading nginx: [ OK ]
訪問測試
基于IP
server { listen 80; server_name www.b.net; location / { root /www/b; index index.html index.htm; deny 172.16.10.8; allow 172.16.0.0/16; deny all } }
重啟服務后訪問測試
壓縮功能
nginx將響應報文發送至客戶端之前可以啟用壓縮功能,這能夠有效地節約帶寬,并提高響應至客戶
端的速度。通常編譯nginx默認會附帶gzip壓縮的功能,因此,可以直接啟用之。
[root@node1 ~]# cp /var/log/messages /www/a/index.html #制造一個比較大的測試頁
未壓縮訪問測試
server { listen 80; server_name www.a.com; gzip on; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript application/json; gzip_disable msie6; location / { root /www/a; index index.html index.htm; } }
重啟服務,壓縮后測試
壓縮成功
防盜鏈
(1) 定義合規的引用
valid_referers none | blocked | server_names | string ...;
(2) 拒絕不合規的引用
if ($invalid_referer) { rewrite ^/.*$ http://www.b.org/403.html }
location ~* \.(jpg|png|gif|jpeg)$ { root /www/b; valid_referers none blocked www.b.net *.b.net; if ($valid_referer) { rewrite ^/ http://www.b.net/403.html; } }
[root@node1 ~]# vim /www/a/index.html <img src="http://www.b.net/images/1.jpg"> #在a.com中引用 [root@node1 ~]# vim /www/b/index.html <img src="http://www.b.net/images/1.jpg"> #b.net自己引用 [root@node1 ~]# service nginx reload
訪問測試
URL rewrite
rewrite regex replacement [flag]; flag: last: 一旦被當前規則匹配并重寫后立即停止檢查后續的其它rewrite的規則,而后通過重寫后的規則重新發起請求; break: 一旦被當前規則匹配并重寫后立即停止后續的其它rewrite的規則,而后繼續由nginx進行后續操作; redirect: 返回302臨時重定向; permanent: 返回301永久重定向;
location /download/ { root /www/b; autoindex on; rewrite ^/download/(.*\.(jpg|png|gif|jpeg))$ /images/&1 last; } [root@node1 ~]# service nginx reload [root@node1 ~]# ls /www/b/download/ #download目錄下沒有任何文件
反向代理
Nginx通過proxy模塊實現反向代理功能。在作為web反向代理服務器時,nginx負責接收客戶請求,并能夠根據URI、客戶端參數或其它的處理邏輯將用戶請求調度至上游服務器上(upstream server)。
nginx在實現反向代理功能時的最重要指令為proxy_pass,它能夠將location定義的某URI代理至指定
的上游服務器(組)上。如下面的示例中,location的/uri將被替換為上游服務器上的/newuri。
server { listen 80; server_name www.a.com; add_header X-Via $server_addr; location / { root /www/a; index index.html index.htm; } location = /node2 { proxy_pass http://172.16.10.124/; } } #上游主機也要配置相應服務及頁面
[root@node1 ~]# vim /etc/nginx/nginx-vhost.conf [root@node1 ~]# vim /etc/nginx/nginx-vhost.conf [root@node1 ~]# curl http://www.a.com www.a.com <img src="http://www.b.net/images/1.jpg"> [root@node1 ~]# curl http://www.a.com/node2 172.16.10.124
緩存
nginx做為反向代理時,能夠將來自上游服務器的響應緩存至本地,并在后續的客戶端請求同樣內容時
直接從本地構造響應報文。
proxy_cache zone|off:定義一個用于緩存的共享內存區域,其可被多個地方調用; proxy_cache_path:定義一個用記保存緩存響應報文的目錄,及一個保存緩存對象的鍵及響應元數 據的共享內存區域(keys_zone=name:size),其可選參數有: levels:每級子目錄名稱的長度,有效值為1或2,每級之間使用冒號分隔,最多為3級; inactive:非活動緩存項從緩存中剔除之前的最大緩存時長; max_size:緩存空間大小的上限,當需要緩存的對象超出此空間限定時,緩存管理器將基于LRU算法 對其進行清理; loader_files:緩存加載器(cache_loader)的每次工作過程最多為多少個文件加載元數據; loader_sleep:緩存加載器的每次迭代工作之后的睡眠時長; loader_threashold:緩存加載器的最大睡眠時長; proxy_cache_valid [ code ...] time:用于為不同的響應設定不同時長的有效緩存時長,例如: proxy_cache_valid 200 302 10m; proxy_cache_methods [GET HEAD POST]:為哪些請求方法啟用緩存功能; proxy_cache_bypass string:設定在哪種情形下,nginx將不從緩存中取數據
http { proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g; server { listen 80; server_name node1; add_header X-Via $server_addr; location / { root /www/b; index index.html index.htm; proxy_pass http://172.16.10.124; proxy_set_header Host $host; proxy_cache STATIC; proxy_cache_valid 200 1d; proxy_cache_valid 301 302 10m; proxy_cache_valid any 1m; proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; } } }
緩存前請求時間
緩存后請求時間
此時緩存目錄應該有緩存文件生成
[root@node1 ~]# ll /data/nginx/cache/ total 4 drwx------ 3 nginx nginx 4096 Jun 13 22:44 e
負載均衡
nginx可利用自身的upstream模塊實現,upstream模塊的負載均衡算法主要有三種,輪調(round-robin)、ip哈希(ip_hash)和最少連接(least_conn)三種。
upstream模塊常用的指令有: ip_hash:基于客戶端IP地址完成請求的分發,它可以保證來自于同一個客戶端的請求始終被轉發至 同一個upstream服務器; keepalive:每個worker進程為發送到upstream服務器的連接所緩存的個數; least_conn:最少連接調度算法; server:定義一個upstream服務器的地址,還可包括一系列可選參數,如: weight:權重; max_fails:最大失敗連接次數,失敗連接的超時時長由fail_timeout指定; fail_timeout:等待請求的目標服務器發送響應的時長; backup:用于fallback的目的,所有服務均故障時才啟動此服務器; down:手動標記其不再處理任何請求;
upstream web { server 172.16.10.124:80; server 172.16.10.125:80; server 127.0.0.1:8080 backup; } server { listen 80; server_name www.b.net; add_header X-Via $server_addr; location / { root /www/b; index index.html index.htm; proxy_pass http://web; } } server { listen 8080; server_name 127.0.0.1; root /www/backup; }
[root@node1 ~]# mkdir /www/backup [root@node1 ~]# echo "Sorry" > /www/backup/index.html [root@node1 ~]# service nginx reload [root@node1 ~]# curl http://172.16.10.123 172.16.10.124 [root@node1 ~]# curl http://172.16.10.123 172.16.10.125 #停掉上游兩臺主機后 [root@node1 ~]# curl http://172.16.10.123 Sorry
如此便可實現簡單的負載均衡功能
The end
好了,有關nginx的基礎配置及應用就先說到這里了,第一次接觸nginx,寫的比較亂,敬請諒解。有什么不對的地方歡迎留言告訴我。以上僅為個人學習整理,如有錯漏,大神勿噴~~~
原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/5320