Nginx的幾個常用配置和技巧

小咖啡111發表於2019-05-16

文章列舉了幾個Nginx常見的,實用的,有趣的配置,希望看過之後能說一句:學到了!

一個站點配置多個域名



server

 {

     listen         80 ;
     server_name   ops-coffee.cn b.ops-coffee.cn;
}

server_name  後跟多個域名即可,多個域名之間用空格分隔

一個服務配置多個站點



server

 {

     listen         80 ;
     server_name   a.ops-coffee.cn;

     location  / {
         root  /home/project/pa;
         index  index.html;
    }
}

server  {
     listen         80 ;
     server_name   ops-coffee.cn b.ops-coffee.cn;

     location  / {
         root  /home/project/pb;
         index  index.html;
    }
}

server  {
     listen         80 ;
     server_name   c.ops-coffee.cn;

     location  / {
         root  /home/project/pc;
         index  index.html;
    }
}

基於Nginx虛擬主機配置實現,Nginx有三種型別的虛擬主機

基於IP的虛擬主機:  需要你的伺服器上有多個地址,每個站點對應不同的地址,這種方式使用的比較少

基於埠的虛擬主機:  每個站點對應不同的埠,訪問的時候使用ip:port的方式訪問,可以修改listen的埠來使用

基於域名的虛擬主機:  使用最廣的方式,上邊例子中就是用了基於域名的虛擬主機,前提條件是你有多個域名分別對應每個站點,server_name填寫不同的域名即可

nginx新增賬號密碼驗證



server

 {

     location  / {
         auth_basic   "please input user&passwd" ;
         auth_basic_user_file  key/auth.key;
    }
}

有很多服務透過nginx訪問,但本身沒有提供賬號認證的功能,就可以透過nginx提供的authbase賬號密碼認證來實現,可以用以下指令碼來生成賬號的密碼



# cat pwd.pl 


#!/usr/bin/perl
use  strict;

my  $pw=$ARGV[ ] ;
print   crypt ($pw,$pw). "\n" ;

使用方法:



#


 perl pwd.pl ops-coffee.cn


opf8BImqCAXww
#   echo   "admin:opf8BImqCAXww"  > key/auth.key

nginx開啟列目錄

當你想讓nginx作為檔案下載伺服器存在時,需要開啟nginx列目錄



server

 {

     location  download {
         autoindex   on ;

         autoindex_exact_size   off ;
         autoindex_localtime   on ;
    }
}

autoindex_exact_size:  為on(預設)時顯示檔案的確切大小,單位是byte;改為off顯示檔案大概大小,單位KB或MB或GB

autoindex_localtime:  為off(預設)時顯示的檔案時間為GMT時間;改為on後,顯示的檔案時間為伺服器時間

預設當訪問列出的txt等檔案時會在瀏覽器上顯示檔案的內容,如果你想讓瀏覽器直接下載,加上下邊的配置







if


 (


$request_filename


 


~* ^.*?\.(txt|pdf|jpg|png)$)


 {


     add_header  Content-Disposition  'attachment' ;
}

配置預設站點



server

 {

     listen   80  default;
}

當一個nginx服務上建立了多個虛擬主機時預設會 從上到下 查詢,如果匹配不到虛擬主機則會返回 第一個 虛擬主機的內容,如果你想指定一個預設站點時,可以將這個站點的虛擬主機放在配置檔案中第一個虛擬主機的位置,或者在這個站點的虛擬主機上配置listen default

不允許透過IP訪問



server

 {

     listen         80  default;
     server_name   _;

     return        404 ;
}

可能有一些未備案的域名或者你不希望的域名將伺服器地址指向了你的伺服器,這時候就會對你的站點造成一定的影響,需要禁止IP或未配置的域名訪問,我們利用上邊所說的default規則,將預設流量都轉到404去

上邊這個方法比較粗暴,當然你也可以配置下所有未配置的地址訪問時直接301重定向到你的網站去,也能為你的網站帶來一定的流量



server

 {

     rewrite  ^/(.*)$   $1      permanent ;
}

直接返回驗證檔案



location

 = /XDFyle6tNA.txt {

     default_type  text/plain;
     return   200   'd6296a84657eb275c05c31b10924f6ea' ;
}

很多時候微信等程式都需要我們放一個txt的檔案到專案裡以驗證專案歸屬,我們可以直接透過上邊這種方式修改nginx即可,無需真正的把檔案給放到伺服器上

nginx配置upstream反向代理


http {

    ...
    upstream tomcats {
        server  192.168 .106 .176  weight= 1 ;
        server  192.168 .106 .177  weight= 1 ;
    }

    server {
        location /ops-coffee/ { 
            proxy_pass http: //tomcats; 

            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded- For  $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

}

稍不注意可能會落入一個 proxy_pass 加槓不加槓的陷阱,這裡詳細說下 proxy_pass proxy_pass / 的區別:

雖然只是一個/的區別但結果確千差萬別。分為以下兩種情況:

1.  目標地址中不帶uri( proxy_pass )。此時新的目標url中,匹配的uri部分不做修改,原來是什麼就是什麼。


location 

/ops-coffee/

 {

    proxy_pass  http: // 192.168 .106 .135 : 8181 ;
}

http: // domain /ops-coffee/    -->     http: // 192.168 .106 .135 : 8181 /ops-coffee/
http: // domain /ops-coffee/action/abc   -->     http:/ / 192.168 .106 .135 : 8181 /ops-coffee/action/abc

2.  目標地址中帶uri( proxy_pass / ,/也是uri),此時新的目標url中,匹配的uri部分將會被修改為該引數中的uri。


location 

/ops-coffee/

 {

    proxy_pass  http: // 192.168 .106 .135 : 8181 /;
}

http: // domain /ops-coffee/    -->     http: // 192.168 .106 .135 : 8181
http: // domain /ops-coffee/action/abc   -->     http:/ / 192.168 .106 .135 : 8181 /action/abc

nginx upstream開啟keepalive



upstream

 tomcat {

     server  ops-coffee.cn: 8080 ;
     keepalive   1024 ;
}

server  {
     location  / {
         proxy_http_version   1 . 1 ;
         proxy_set_header  Connection  "" ;

         proxy_pass  
    }
}

nginx在專案中大多數情況下會作為反向代理使用,例如nginx後接tomcat,nginx後接php等,這時我們開啟nginx和後端服務之間的keepalive能夠減少頻繁建立TCP連線造成的資源消耗,配置如上

keepalive:  指定每個nginxworker可以保持的最大連線數量為1024,預設不設定,即nginx作為client時keepalive未生效

proxy_http_version 1.1:  開啟keepalive要求HTTP協議版本為HTTP 1.1

proxy_set_header Connection "":  為了相容老的協議以及防止http頭中有 Connection close 導致的keepalive失效,這裡需要及時清掉HTTP頭部的Connection

404自動跳轉到首頁



server

 {

     location  / {
        error_page   404  =   @ops -coffee;
    }

     location   @ops -coffee {
        rewrite   .*  /  permanent ;
    }
}

網站出現404頁面不是特別友好,我們可以透過上邊的配置在出現404之後給自動跳轉到首頁去


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31560357/viewspace-2644667/,如需轉載,請註明出處,否則將追究法律責任。

相關文章