Nginx部署及參數配置

一、一個簡單的demo

worker_processes  1;  # 設置多少個進程,與cup覈保持一致最好
events {
    worker_connections  1024; # 每個進程允許的最大連接數
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server
    {
        listen  8080;
        server_name  localhost;
        location / {
            root    D:/STUDY;   # 當輸入[server_name]:[listen] 時會進入這個目錄
            index   a.html;  # 默認界面
        }
        error_page 404 /error.html; #根據錯誤碼跳轉到error 界面
    }
} 

當在瀏覽器中輸入[server_name]:[listen] (也就是localhost:8080)時,會在location 下的root對應的文件夾中找index 對應的界面(也就是a.html);

每次修改完conf 文件,可以用以下指令校驗conf 配置是否合法

nginx -t -c "/etc/nginx/nginx.conf"   #校驗文件合法

location的配置規則:

語法規則: location [=||*|^~] /uri/ { … }

  • = 開頭表示精確匹配
  • ^~ 開頭表示uri以某個常規字符串開頭,理解爲匹配 url路徑即可。nginx不對url做編碼,因此請求爲/static/20%/aa,可以被規則^~ /static/ /aa匹配到(注意是空格)。
  • ~ 開頭表示區分大小寫的正則匹配
  • ~* 開頭表示不區分大小寫的正則匹配
  • !和!*分別爲區分大小寫不匹配及不區分大小寫不匹配 的正則
  • / 通用匹配,任何請求都會匹配到。
  • 多個location配置的情況下匹配順序爲
    首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最後是交給 / 通用匹配。當有匹配成功時候,停止匹配,按當前匹配規則處理請求

二、 Nginx 日誌

在nginx 中使用日誌,可以添加以下代碼:
在這裏插入圖片描述
主要說一下log_format (日誌的格式化):

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

log_fomat 爲日誌輸出格式
remote_addr: 客戶端地址
remote_user:認證的用戶名,沒有開啓不會顯示
time_local : nginx 服務器時間
request : request頭的請求行(裏面包含服務器的地址後半部分)
status : 狀態碼
body_bytes_sent : 服務端響應給客戶端的body信息大小
http_referer : 上一級url 的地址
http_user_agent: 客戶端使用代理(比如使用什麼訪問的)
http_x_forwarded_for : 每一級請求所攜帶的http 信息

下面爲一段輸出的日誌,可以跟上述的format 對比一下

127.0.0.1 - - [30/Dec/2018:14:02:03 +0800] "GET /aa HTTP/1.1" 404 51 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-"
127.0.0.1 - - [30/Dec/2018:14:11:31 +0800] "GET /aa HTTP/1.1" 404 51 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" "-"

三、Nginx Modules (模塊)

當我們輸入nginx -V 時,會輸出很多參數, 這些參數中就有很多以with-******_module格式的參數, 這些參數爲nginx 的功能模塊,我們說一下基礎的模塊:

1、 --with-http_stub_status_module (查看nginx 客戶端連接狀態)

配置語法

Syntax:	stub_status;
Default:	—
Context:	server, location

配置方式

location /mystatus{
   stub_status;
}

瀏覽器請求
在這裏插入圖片描述
當前活躍的連接數
接受 處理 總連接
讀 寫 等待

2、 --with-http_random_index_module (隨機選擇一個文件做主頁)

語法:

Syntax:	index file ...;
Default:	
index index.html;
Context:	http, server, location

在這裏插入圖片描述
會在指定目錄下隨機選擇主頁

3、 --with-http_sub_module (http內容替換)
語法:

Syntax:	sub_filter string replacement;
Default:	—
Context:	http, server, location

demo:

location / {
    sub_filter '<a href="http://127.0.0.1:8080/'  '<a href="https://$host/';
    sub_filter '<img src="http://127.0.0.1:8080/' '<img src="https://$host/';
    sub_filter_once on;
}
sub_filter 'other' 'haochen';  #只替換一個字符
# 如果替換多個字符,就添加一段代碼
sub_filter_once off  #關閉扣替換所有字符

4、 連接限制和請求限制

語法

Syntax:	limit_conn_zone key zone=name:size;
Default:	—
Context:	http

Syntax:	limit_conn zone number;
Default:	—
Context:	http, server, location
Syntax:	limit_req_zone key zone=name:size rate=rate [sync];
Default:	—
Context:	http

Syntax:	limit_req zone=name [burst=number] [nodelay | delay=number];
Default:	—
Context:	http, server, location

限制請求的條數:

limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
#location 下
limit_req zone=req_zone burst=3 nodelay;

上述表示 每秒執行一條請求, 三條作爲緩存,其他的限制執行

連接限制:

limit_conn_zone $binary_remote_addr zone=conn_zone:1m
#location 、server
limit_conn conn_zone 1;

上述表示一個同一時刻只能有一個連接過來

壓力測試工具安裝:

yum install httpd-tool  
ab -n 20 -c 20 www.baidu.com  // 請求總數20  併發20

更多介紹查看官網文檔 http://nginx.org/en/docs/

5、訪問控制

配置語法:

Syntax:	allow address | CIDR | unix: | all;
Default:	—
Context:	http, server, location, limit_except

Syntax:	deny address | CIDR | unix: | all;
Default:	—
Context:	http, server, location, limit_except

demo

location / {
    deny  192.168.1.1;
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}

6、 http_auth_basic_module(用戶登錄認證)

對客戶端的請求進行登錄驗證

配置語法:

Syntax:	auth_basic string | off;
Default:	
auth_basic off;
Context:	http, server, location, limit_except

Syntax:	auth_basic_user_file file;
Default:	—
Context:	http, server, location, limit_except

首先要生成一個保存用戶名和密碼的配置文件,可以使用htpassword 加密:

  htpasswd -c auth.conf panlei

nginx.conf 中配置

location / {
    auth_basic           "closed site";
    auth_basic_user_file conf/auth.conf;
}

訪問效果
在這裏插入圖片描述

四、各種使用場景

1、 靜態資源

    語法: tcp_nopush on | off;
    默認值: tcp_nopush off;
    上下文: http, server, location

選項僅在使用sendfile的時候纔開啓
結果就是數據包不會馬上傳送出去,等到數據包最大時,一次性的傳輸出去,這樣有助於解決網絡堵塞。


    語法: tcp_nodelay on | off;
    默認值:  tcp_nodelay on;
    上下文: http, server, location

提高網絡的實時性


語法:	gzip on | off;
默認值:	gzip off;
上下文:	http, server, location, if in location

壓縮運輸

各項參數
gzip_comp_level 1;  # 壓縮比例
gzip_http_version 1.1  #壓縮版本
gzip_types text/html  #文件格式

2、 代理

語法:	proxy_pass URL;
Default:	—
上下文:	location, if in location, limit_except

一個簡單的demo:

server {
    listen       80;
    server_name  192.168.136.130;
    location ~ /login$ {
       proxy_pass http://192.168.1.116:8081;
    }
}

訪問130/login 會被轉發到116:8081/login

使用代理經常用的屬性:

proxy_redirect default;

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;

proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;

proxy_buffer_size 32k;
proxy_buffering on;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_temp_file_size 256k;


如果只讓特定ip 訪問:

# 僅允許116.62.103.228 訪問
 location / {
     if ( $http_x_forwarded_for !~* "^116\.62\.103\.228") {
         return 403;
     }
     root   /opt/app/code;
     index  index.html index.htm;
 }

3、負載均衡

語法: upstream name {} ,多配製在http 層。

demo:

    upstream pl{
        server 192.168.1.251:8080 down;
        server 192.168.1.252:8080 backup;
        server 192.168.1.253:8080 max_fails=1 fail_timeout=10s;
    }
server {
    listen       80;
    server_name  192.168.1.254;
    location / {
        proxy_pass http://pl;
    }
}

其中每個後綴的的作用:

後綴 描述
down 當前server 不參與負載均衡
backup 備份服務器
max_fails 最大失敗數
fail_timeout 經過max_fails後服務暫停的時間
max_conns 最大連接數

nginx 負載均衡默認是輪詢的規則,
nginx 還有以下的輪詢策略:

調度策略 描述
加權輪詢 根據weight值越大,分配的訪問機率越高
ip_hash 每個請求根據IP的hash 分配,這樣來自同一IP的可分配到同一服務器
url_hash 按照訪問的url 的hash分配
least_conn 最少鏈接數,哪個服務器鏈接數少,就分配到哪個服務器
hash關鍵數值 hash自定義值

ip_hash 配置時,只需要在upstream 中添加關鍵字 ip_hash 就可以
hash 配置同上, 例如 hash $request_uri

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章