Nginx的幾個經常使用配置和技巧

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

一個站點配置多個域名

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

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

一個服務配置多個站點

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有三種類型的虛擬主機nginx

基於IP的虛擬主機: 須要你的服務器上有多個地址,每一個站點對應不一樣的地址,這種方式使用的比較少後端

基於端口的虛擬主機: 每一個站點對應不一樣的端口,訪問的時候使用ip:port的方式訪問,能夠修改listen的端口來使用瀏覽器

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

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[0] ;
print crypt($pw,$pw)."\n";

使用方法:微信

# perl pwd.pl ops-coffee.cn
opf8BImqCAXww
# echo "admin:opf8BImqCAXww" > key/auth.key

nginx開啓列目錄

當你想讓nginx做爲文件下載服務器存在時,須要開啓nginx列目錄dom

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 ^/(.*)$ https://ops-coffee.cn/$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 http://tomcatsproxy_pass http://tomcats/的區別:

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

  1. 目標地址中不帶uri(proxy_pass http://tomcats)。此時新的目標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
  1. 目標地址中帶uri(proxy_pass http://tomcats/,/也是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 http://tomcat;
    }
}

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以後給自動跳轉到首頁去


相關文章推薦閱讀:

相關文章
相關標籤/搜索