一、一個簡單的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