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 16:21
下一篇 2015-06-15 16:22

相關推薦

  • 數組

    數組 變量:存儲單個元素的內存空間 數組:存儲多個元素的連續的內存空間,相當于多個變量的集合 數組名和索引 索引:編號從0開始,屬于數值索引 注意:索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引, 八十的數組支持稀疏格式(索引不連續 聲明數組: Declare -a ARRAY_NAME Declare -A ARRAY_NAME:關聯數組 注意…

    Linux干貨 2018-01-02
  • Linux第三周學習博客作業

    對第三周學習的內容進行總結

    Linux干貨 2017-12-17
  • 馬哥教育網絡班20期+第2周課程練習

    1、Linux上的文件管理類命令有:cp復制, mv剪切, rm移除 使用方法: cp復制  cp [OPTION]… [-T] SOURCE DEST  常用選項: -i:交互式 -r: 遞歸復制目錄及內部的所有內容 -a: 歸檔 演示: SRC是文件,會將/etc/fstab 中內容覆蓋到/bin/po…

    Linux干貨 2016-06-23
  • 高考作業

    1、簡述TCP三次握手四次揮手過程及各過程中客戶端和服務器端的狀態。 TCP三路握手,作用為完成三次握手,主機A與主機B開始傳送數據。 第一次握手:客戶端A(狀態為SYN_SEND)發送位碼為syn=1,隨機產生seq number=1234567的數據包到服務器,服務器B(狀態為LISTEN)由SYN=1知道,客戶端A要求建立聯機; 第二次握手:服務器B(…

    Linux干貨 2016-06-22
  • MySQL架構

    1.MySQL整體邏輯架構 我們先下圖看看MySQL整體邏輯架構(MySQL’s Logical Architecture)                       圖1  第一層,即最上一層,所包含的服務并不是MySQL所獨有的技術。…

    Linux干貨 2015-04-13
  • 馬哥教育網絡班20期+第二周博客作業

    1.Linux上的文件管理類命令 2.bash命令學習總結 3.bash命令實例 4.元數據與時間戳 5.命令別名 6.練習題6~12 1.Linux上的文件管理類命令        Linux上的文件管理類命令可分為查看類、目錄管理類、權…

    Linux干貨 2016-06-19
欧美性久久久久