Nginx配置與應用詳解

前言

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  ]

訪問測試

1.jpg

基于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
    }
}

重啟服務后訪問測試

2.jpg

壓縮功能

nginx將響應報文發送至客戶端之前可以啟用壓縮功能,這能夠有效地節約帶寬,并提高響應至客戶

端的速度。通常編譯nginx默認會附帶gzip壓縮的功能,因此,可以直接啟用之。

[root@node1 ~]# cp /var/log/messages /www/a/index.html #制造一個比較大的測試頁

未壓縮訪問測試

3.jpg

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;
    }
}

重啟服務,壓縮后測試

4.jpg

壓縮成功

防盜鏈

(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

訪問測試

5.jpg

6.jpg

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目錄下沒有任何文件

7.jpg

反向代理

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;

  }
 }
 }

緩存前請求時間

8.jpg

緩存后請求時間

9.jpg

此時緩存目錄應該有緩存文件生成

[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

(3)
書生書生
上一篇 2015-06-15
下一篇 2015-06-15

相關推薦

  • CentOS6+ LAMP+ wordpress 搭建個人博客站

        每個IT工程師都期待擁有一個自己的博客站,本文講述在CentOS 6系統LAMP環境下使用WordPress框架構建個人博客站的詳細過程。     —-構建LAMP環境—- 1,安裝apache,mysql php yum install -y httpd mysql…

    2017-07-11
  • N26-第八周作業-邢巖

    馬哥門徒-N26-邢巖 1、寫一個腳本,使用ping命令探測172.16.250.1-172.16.250.254之間的所有主機的在線狀態;      在線的主機使用綠色顯示;      不在線的主機使用紅色顯示; #!/bin/bash # Author: jeque# Des…

    2017-03-24
  • netstat命令和ss命令

    詳解netstat命令和ss命令

    Linux干貨 2018-01-01
  • 第八周博客作業

    1、寫一個腳本,使用ping命令探測172.16.250.1-172.16.250.254之間的所有主機的在線狀態; 在線的主機使用綠色顯示; 不在線的主使用紅色顯示; #!/bin/bash declare -i i=1 ping_172() { if ping -W 1 -c 1 172.16.250.$1 &> /dev/null; th…

    Linux干貨 2017-05-22
  • iptables之froward

    先克隆一臺centos服務器添加虛擬網卡 同時兩個服務器配上host only的網卡 echo 1 > /proc/sys/net/ipv4/ip_forward打開網卡間轉發 有回包 但是沒有10.0.0.3還是沒有ping通原因是192.168.68.134 的網關指向了192.168.68.2 而不是192.168.68.144添加一條指向192…

    2017-11-12
  • 雷人的程序注釋

    使用Google code search可以搜索到一些比較有趣的代碼注釋,呵呵。下面的這些程序注釋有搞笑的,也有粗口,看來寫程序本來也不是一件很枯燥的事,關鍵看你的心態如何了。讀到這些注釋的時候,只能想到一個詞,那就是“瘋狂的程序員”,哈哈。Have a Fun  ;-) 寫個程序時不忘表達自己的感情,以免以后忘了。 呵呵,看來自己也不是很自信。 …

    Linux干貨 2016-05-10
欧美性久久久久