Nginx的幾種經常使用配置

1. 設置默認虛擬主機javascript

(本文永久地址:http://woymk.blog.51cto.com/10000269/1920204php

對沒有匹配的Host值時,返回錯誤403到客戶端css

server {
    listen       80 default_server;
    server_name  _;
    return       403;
}html


2. 用戶認證java

用戶認證須要用到apache的htpasswd命令生成密碼,若是沒有安裝apache,可使用yum install httpd安裝。node

生成密碼文件,建立用戶
nginx

htpasswd -c /usr/local/nginx/conf/htpasswd  test正則表達式

添加test用戶,第一次添加時須要加-c參數,第二次添加時不須要-c參數
apache

在nginx的配置文件中添加
location  / {
                       auth_basic              "Auth";
                       auth_basic_user_file   /usr/local/nginx/conf/.htpasswd;
}後端


3. 域名重定向(Rewrite)
例子1:

server_name  www.a.com  www.test.com;

if ($host != 'www.test.com' ) {
        rewrite  ^/(.*)$  http://www.test.com/$1  permanent;
}


例子2:
訪問 www.abc.com  請求到 www.abc.com/abc/

if ($document_uri !~ 'abc')
    {
            rewrite ^/(.*)$ http://www.abc.com/abc/$1 permanent;
    }

注:$document_uri表示訪問的url


Nginx的Rewrite規則與Apache幾乎徹底一致,
所不一樣的是最後的flag標記

flag標記有:

last 至關於Apache裏的[L]標記,表示完成rewrite,再也不匹配後面的規則
break 與last相似,本條規則匹配完成後,終止匹配,再也不匹配後面的規則
redirect 返回302臨時重定向 ,瀏覽器會顯示跳轉後的URL地址
permanent 返回301永久重定向,瀏覽器會顯示跳轉後的URL地址

last/break用來實現URL重寫,瀏覽器地址欄的URL不變,但在服務器端訪問的路徑發生了變化。
redirect/permanent實現URL跳轉,瀏覽器地址欄URL會顯示跳轉後的URL。
使用 alias 指令時必須用 last 標記 ,使用 proxy_pass 指令時要用 break 表示。last 標記在本條 rewrite 規則執行完畢後,會對其所在 server{....}標籤從新發起請求,而 break 標記則在本條

規則匹配完成後,終止匹配。 


Apache和Nginx規則的對應關係

Apache的RewriteCond對應Nginx的if
Apache的RewriteRule對應Nginx的rewrite
Apache的[R]對應Nginx的redirect
Apache的[P]對應Nginx的last
Apache的[R,L]對應Nginx的redirect
Apache的[P,L]對應Nginx的last
Apache的[PT,L]對應Nginx的last


4. 日誌切割

編寫腳本:
vi /usr/local/sbin/logrotate.sh  //加入

#! /bin/bash
d=`date -d "-1 day" +%Y%m%d`
/bin/mv /usr/local/nginx/logs/test.log /usr/local/nginx/logs/test_$d.log
/etc/init.d/nginx reload >/dev/null 2>&1
/bin/gzip /usr/local/nginx/logs/logs/test_$d.log #若是要對日誌進行壓縮就加上這句


日誌格式

log_format main '$remote_addr - $remote_user [$time_local] $request '
                     '"$status" $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';


此日誌格式爲,ip不只記錄代理的ip還記錄遠程客戶端真實IP。

 log_format main1 '$proxy_add_x_forwarded_for - $remote_user [$time_local] '
                       '"$request" $status $body_bytes_sent '
                       '"$http_referer" "$http_user_agent"';


內部變量說明

$remote_addr與$http_x_forwarded_for用以記錄客戶端IP地址,一個記錄代理IP,一個記錄真實IP;

$remote_user 用以記錄客戶端用戶名稱;

$time_local 用來記錄訪問時間與時區;

$request 用來記錄請求的url與http協議;

$status 用來記錄請求狀態,成功是200;

$body_byte_sent 記錄發送給客戶端文件主體內容大小;

$http_referer 用來記錄從哪一個頁面連接訪問過來的;

$http_user_agent 記錄客戶端瀏覽器的相關信息;

錯誤日誌error_log日誌級別

error_log 級別分爲 debug, info, notice, warn, error, crit  默認爲crit, 該級別在日誌名後邊定義格式以下:
error_log  /your/path/error.log crit; 
crit 記錄的日誌最少,而debug記錄的日誌最多。若是你的nginx遇到一些問題,好比502比較頻繁出現,可是看默認的error_log並無看到有意義的信息,那麼就能夠調一下錯誤日誌的級別,當你調成error級別時,錯誤日誌記錄的內容會更加豐富。


5. 靜態文件不記錄日誌,而且配置緩存
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
         {
                 expires      30d;
                 access_log off;
         }

         location ~ .*\.(js|css)$
         {
                 expires      12h;
                 access_log off;
         }


6. 防盜鏈
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ {
     valid_referers none blocked server_names  www.a.com *.b.com;
         if ($invalid_referer) {
             return 403;
             #rewrite ^/ http://www.example.com/nophoto.gif;
         }
}

詳細瞭解請參考《利用nginx「ngx_http_referer_module」模塊設置防盜鏈》


7. 訪問控制

黑名單
deny 192.168.1.1;

deny 192.168.1.2;

deny 192.168.2.0/24;

allow all;


白名單
allow 192.168.1.0/24;
allow 127.0.0.1;
allow 192.168.2.1;
deny all;


8. 反向代理

server {
    listen 80;
    server_name www.test.com;

    location / {
        proxy_pass      http://1.1.1.1/;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

}


9. 負載均衡

upstream test {
    ip_hash;
    server 192.168.1.1;
    server 192.168.1.2;
}

server {
    listen 80;
    server_name www.test.com;

    location / {
        proxy_pass      http://test/;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
注:加上ip_hash做用是使每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。


10. if指令

該指令用於檢查一個條件是否符合,若是條件符合,則執行大括號內的語句。If指令不支持嵌套,不支持多個條件&&和||處理。

1) 正則表達式匹配,其中:

== 等值比較
~  爲區分大小寫匹配
~* 爲不區分大小寫匹配
!~和!~*分別爲區分大小寫不匹配及不區分大小寫不匹配

舉例:if ($http_user_agent ~ MSIE) {rewrite  ^(.*)$  /msie/$1  break;}


2) 文件及目錄匹配,其中:

-f和!-f用來判斷是否存在文件
-d和!-d用來判斷是否存在目錄
-e和!-e用來判斷是否存在文件或目錄
-x和!-x用來判斷文件是否可執行

舉例:if (!-f $request_filename) {proxy_pass  http://127.0.0.1;}


11. location命令

location表達式類型

~ 表示執行一個正則匹配,區分大小寫
~* 表示執行一個正則匹配,不區分大小寫
^~ 表示普通字符匹配。使用前綴匹配。若是匹配成功,則再也不匹配其餘location。
= 進行普通字符精確匹配。也就是徹底匹配。
@ "@" 定義一個命名的 location,使用在內部定向時,例如 error_page, try_files


location優先級

在nginx的location和配置中location的順序沒有太大關係。正location表達式的類型有關。相同類型的表達式,字符

串長的會優先匹配。

如下是按優先級排列說明:
第一優先級:等號類型(=)的優先級最高。一旦匹配成功,則再也不查找其餘匹配項。
第二優先級:^~類型表達式。一旦匹配成功,則再也不查找其餘匹配項。
第三優先級:正則表達式類型(~ ~*)的優先級次之。若是有多個location的正則能匹配的話,則使用正則表達式最長的那個。
第四優先級:常規字符串匹配類型。按前綴匹配。


12. nginx全局變量
arg_PARAMETER    #這個變量包含GET請求中,若是有變量PARAMETER時的值。
args                    #這個變量等於請求行中(GET請求)的參數,如:foo=123&bar=blahblah;
binary_remote_addr #二進制的客戶地址。
body_bytes_sent    #響應時送出的body字節數數量。即便鏈接中斷,這個數據也是精確的。
content_length    #請求頭中的Content-length字段。
content_type      #請求頭中的Content-Type字段。
cookie_COOKIE    #cookie COOKIE變量的值
document_root    #當前請求在root指令中指定的值。
document_uri      #與uri相同。
host                #請求主機頭字段,不然爲服務器名稱。
hostname          #Set to themachine’s hostname as returned by gethostname
http_HEADER
is_args              #若是有args參數,這個變量等於」?」,不然等於」",空值。
http_user_agent    #客戶端agent信息
http_cookie          #客戶端cookie信息
limit_rate            #這個變量能夠限制鏈接速率。
query_string          #與args相同。
request_body_file  #客戶端請求主體信息的臨時文件名。
request_method    #客戶端請求的動做,一般爲GET或POST。
remote_addr          #客戶端的IP地址。
remote_port          #客戶端的端口。
remote_user          #已經通過Auth Basic Module驗證的用戶名。
request_completion #若是請求結束,設置爲OK. 當請求未結束或若是該請求不是請求鏈串的最後一個時,爲空(Empty)。
request_method    #GET或POST
request_filename  #當前請求的文件路徑,由root或alias指令與URI請求生成。
request_uri          #包含請求參數的原始URI,不包含主機名,如:」/foo/bar.php?arg=baz」。不能修改。
scheme                #HTTP方法(如http,https)。
server_protocol      #請求使用的協議,一般是HTTP/1.0或HTTP/1.1。
server_addr          #服務器地址,在完成一次系統調用後能夠肯定這個值。
server_name        #服務器名稱。
server_port          #請求到達服務器的端口號。


附上一個nginx.conf樣板:

user nobody nobody;
 worker_processes 2;
 error_log /usr/local/nginx/logs/nginx_error.log crit;
 pid /usr/local/nginx/logs/nginx.pid;
 worker_rlimit_nofile 51200;
 events
 {
     use epoll;
     worker_connections 6000;
 }
 http
 {
     include mime.types;
     default_type application/octet-stream;
     server_names_hash_bucket_size 3526;
     server_names_hash_max_size 4096;
     log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
     '$host "$request_uri" $status'
     '"$http_referer" "$http_user_agent"';
     sendfile on;
     tcp_nopush on;
     keepalive_timeout 30;
     client_header_timeout 3m;
     client_body_timeout 3m;
     send_timeout 3m;
     connection_pool_size 256;
     client_header_buffer_size 1k;
     large_client_header_buffers 8 4k;
     request_pool_size 4k;
     output_buffers 4 32k;
     postpone_output 1460;
     client_max_body_size 10m;
     client_body_buffer_size 256k;
     client_body_temp_path /usr/local/nginx/client_body_temp;
     proxy_temp_path /usr/local/nginx/proxy_temp;
     fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
     fastcgi_intercept_errors on;
     tcp_nodelay on;
     gzip on;
     gzip_min_length 1k;
     gzip_buffers 4 8k;
     gzip_comp_level 5;
     gzip_http_version 1.1;
     gzip_types text/plain application/x-javascript text/css text/htm application/xml;
 server
 {
     listen 80;
     server_name localhost;
     index index.html index.htm index.php;
     root /usr/local/nginx/html;
     location ~ \.php$ {
         include fastcgi_params;
         fastcgi_pass unix:/tmp/php-fcgi.sock;
         fastcgi_index index.php;
         fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
     }
 }
 }
相關文章
相關標籤/搜索