Nginx基礎應用
目錄索引
當找不到首頁文件內容時, 會展示目錄結構,這個功能一般不用除非有特殊需求-->autoindex on;
1.Nginx默認是不允許列出整個目錄瀏覽下載。
2.當Nginx配置文件中指定了autoindex on;參數:當首頁文件不存在時。瀏覽網頁會顯示站點目錄下所有文件或重要目錄
3.可以被Nginx服務處理的文件資源,點擊後直接顯示文件內容
4.不可以被Nginx服務處理的文件資源,會通過瀏覽器直接下載
5.Nginx資源識別文件 /etc/nginx/mime.types
擴展 Apache軟件,沒有首頁文件,默認會把目錄下面的信息顯示出來
官網說明
Syntax: autoindex on | off;
Default: autoindex off;
Context: http, server, location
autoindex常用參數
autoindex_exact_size off;
默認為on, 顯示出文件的確切大小,單位是bytes。
修改為off,顯示出文件的大概大小,單位是kB或者MB或者GB。
autoindex_localtime on;
默認為off,顯示的文件時間為GMT時間。
修改為on, 顯示的文件時間為文件的服務器時間。
charset utf-8,gbk;
默認中文目錄亂碼,添加上解決亂碼。
2.配置站點目錄瀏覽功能
//開啟目錄瀏覽 location / { root html; autoindex on; autoindex_localtime on; autoindex_exact_size off; }
Nginx狀態監控
1.ngx_http_stub_status_module用於展示Nginx連接狀態信息,
需要--with-http_stub_status_module模塊支持
官網說明
Syntax: stub_status;
Default: —
Context: server, location
2.配置Nginx status
location /nginx_status {
stub_status;
access_log off;
}
3.使用瀏覽器訪問http://IP/nginx_status訪問後得到的結果
Active connections:2 #當前活動的連接數 server accepts handled requests 16 16 19 accepts 16 # 總的tcp連接數connection handled 16 # 成功tcp連接數connection(失敗連接=(總連接數-成功連接數)) 這個值如果優化的好一般是和accepts的值相同的 除非達到資源限制 worker_connections 連接數限制 requests 19 # 總共處理的http請求數requests #keepalive_timeout 0; # 每次連接都會產生一次請求(短連接) #keepalive_timeout 60; # 在60s以內的請求建立在一個連接基礎之上(長連接) Reading:2 Writing:1 Waiting: 19 Reading # 當前Nginx正在讀取請求頭的連接數 Writing # 當前Nginx將響應寫回客戶機的連接數 Waiting # 等待連接數 開啟TCP長連接後才有
?
Nginx訪問控制
基於IP的訪問控制 http_access_module
基於用戶登陸認證 http_auth_basic_module
#1.Nginx基於IP的訪問控制
官方說明
//允許配置語法
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
1.訪問控制配置示例, 拒絕指定的IP, 其他全部允許
location /nginx_status {
stub_status;
access_log off;
deny 10.0.0.1;
allow all;
}
2.訪問控制配置示例, 只允許誰能訪問, 其它全部拒絕
location / {
root html;
index index.php index.html index.htm;
allow 10.0.0.0/24;
allow 127.0.0.1;
deny all;
}
3.http_access_module局限性
下圖是使用http_x_forwarded_for記錄真實客戶端IP地址以及代理服務器IP
解決方式
1.采用HTTP頭信息控制訪問, 代理以及web服務開啟http_x_forwarded_for
2.結合geo模塊作
3.通過HTTP自定義變量傳遞
#2.Nginx基於用戶登陸認證
//配置語法
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
//需要安裝依賴組件
[root@xuliangwei ~]# yum install httpd-tools
[root@xuliangwei ~]# htpasswd -b -c /etc/nginx/auth_conf bgx xuliangwei
//可在http,server,location下添加如下信息
auth_basic "Auth access Blog Input your Passwd!";
auth_basic_user_file /etc/nginx/auth_conf;
用戶認證局限性
1.用戶信息依賴文件方式
2.用戶管理文件過多, 無法聯動
3.操作管理機械,效率低下
解決辦法
1.Nginx結合LUA實現高效驗證
2.Nginx結合LDAP利用nginx-auth-ldap模塊
Nginx訪問限制
經常會遇到這種情況,服務器流量異常,負載過大等等。對於大流量惡意的×××訪問, 會帶來帶寬的浪費,服務器壓力,影響業務,往往考慮對同一個ip的連接數,並發數進行限制。 ngx_http_limit_conn_module
模塊可以根據定義的key
來限制每個鍵值的連接數,如同一個IP來源的連接數。
limit_conn_module 連接頻率限制
limit_req_module 請求頻率限制
http協議的連接與請求
HTTP是建立在TCP, 在完成HTTP請求需要先建立TCP三次握手(稱為TCP連接),在連接的基礎上在HTTP請求。
HTTP
請求建立在一次TCP連接基礎上,一次
TCP請求至少產生一次
HTTP`請求
註:客戶端的IP地址作為鍵。
$remote_addr 變量的長度為7字節到15字節
$binary_remote_addr 變量的長度是固定的4字節
如果共享內存空間被耗盡,服務器將會對後續所有的請求返回 503錯誤 (Service Temporarily Unavailable)
1.Nginx連接限制配置
//Nginx連接限制語法
Syntax: limit_conn_zone key zone=name:size;
Default: —
Context: http
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
//具體配置如下:
http {
//http段配置連接限制, 同一時刻只允許一個客戶端IP連接
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
...
server {
...
location / {
//同一時刻只允許一個客戶端IP連接
limit_conn conn_zone 1;
}
//壓力測試
yum install -y httpd-tools
ab -n 50 -c 20 http://127.0.0.1/index.html
2.Nginx請求限制配置
//Nginx請求限制語法
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: —
Context: http
Syntax: limit_conn zone number [burst=number] [nodelay];
Default: —
Context: http, server, location
//具體配置如下:
http {
//http段配置請求限制, rate限制速率,限制一秒鐘最多一個IP請求
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
...
server {
...
location / {
//1r/s只接收一個請求,其余請求拒絕處理並返回錯誤碼給客戶端
limit_req zone=req_zone;
//請求超過1r/s,剩下的將被延遲處理,請求數超過burst定義的數量, 多余的請求返回503
#limit_req zone=req_zone burst=3 nodelay;
}
//壓力測試
yum install -y httpd-tools
ab -n 50 -c 20 http://127.0.0.1/index.html
?
連接限制沒有請求限制有效?
我們前面說過, 多個請求可以建立在一次的TCP連接之上, 那麽我們對請求的精度限制,當然比對一個連接的限制會更加的有效。
因為同一時刻只允許一個連接請求進入。
但是同一時刻多個請求可以通過一個連接進入。
所以請求限制才是比較優的解決方案。
Nginx日誌配置
在學習日誌之前, 我們需要先回顧下HTTP請求和返回
curl -v http://www.baidu.com
Nginx
有非常靈活的日誌記錄模式。每個級別的配置可以有各自獨立的訪問日誌。日誌格式 通過log_format
命令定義格式。
1.log_format指令
#配置語法: 包括: error.log access.log
Syntax: log_format name [escape=default|json] string ...;
Default: log_format combined "...";
Context: http
#默認Nginx定義日誌語法
log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘
‘$status $body_bytes_sent "$http_referer" ‘
‘"$http_user_agent" "$http_x_forwarded_for"‘;
#Nginx日誌格式允許包含的變量:
$remote_addr # 記錄客戶端IP地址
$remote_user # 記錄客戶端用戶名
$time_local # 記錄通用的本地時間
$time_iso8601 # 記錄ISO8601標準格式下的本地時間
$request # 記錄請求的方法以及請求的http協議
$status # 記錄請求狀態碼(用於定位錯誤信息)
$body_bytes_sent # 發送給客戶端的資源字節數,不包括響應頭的大小
$bytes_sent # 發送給客戶端的總字節數
$msec # 日誌寫入時間。單位為秒,精度是毫秒。
$http_referer # 記錄從哪個頁面鏈接訪問過來的
$http_user_agent # 記錄客戶端瀏覽器相關信息
$http_x_forwarded_for #記錄客戶端IP地址
$request_length # 請求的長度(包括請求行, 請求頭和請求正文)。
$request_time # 請求花費的時間,單位為秒,精度毫秒
#註:如果Nginx位於負載均衡器,nginx反向代理之後, web服務器無法直接獲取到客 戶端真實的IP地址。
#$remote_addr獲取的是反向代理的IP地址。 反向代理服務器在轉發請求的http頭信息中,
#增加X-Forwarded-For信息,用來記錄客戶端IP地址和客戶端請求的服務器地址。
2.access_log指令
Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except
Example:
server {
...
access_log /var/log/nginx/www.bgx.com.log;
...
?
Nginx虛擬站點
所謂虛擬主機,及在一臺服務器上配置多個網站
如: 公司主頁、博客、論壇看似三個網站, 實則可以運行在一臺服務器上。
1.基於域名虛擬主機配置實戰
1.創建web站點目錄
[root@bgx ~]# mkdir /soft/code/{www,bbs}
[root@bgx ~]# echo "www" > /soft/code/www/index.html
[root@bgx ~]# echo "bbs" > /soft/code/bbs/index.html
2.配置不同域名的虛擬主機
[root@bgx ~]# cat /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.xuliangwei.com;
root /soft/code/www;
index index.html;
...
}
[root@bgx ~]# cat /etc/nginx/conf.d/bbs.conf
server {
...
listen 80;
server_name bbs.xuliangwei.com;
root /soft/code/bbs;
index index.html;
}
2.基於端口虛擬主機配置實戰
//僅修改listen監聽端口即可, 但不能和系統端口出現沖突
server {
...
listen 8001;
...
}
server {
...
listen 8002;
...
}
3.基於虛擬主機別名配置實戰
實現用戶訪問多個域名對應同一個網站, 比如用戶訪問www.xuliangwei.com和訪問xuliangwei.com內容一致
#1.默認配置方式
[root@bgx ~]# vim /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.bgx.com;
}
server {
listen 80;
server_name bgx.com;
}
#2.使用別名配置方式
[root@bgx ~]# vim /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.bgx.com bgx.com;
...
}
#3.測試訪問, 帶www和不帶www是一樣的
[root@bgx ~]# curl bgx.com
Go
[root@bgx ~]# curl www.bgx.com
Go
Nginx Location
使用Nginx Location控制訪問網站規則
一個server可以有多個location配置,但多個location配置的優先級又該如何劃分
Location語法規則:
location [=|^~|~|~*|!~|!~*|/] /uri/ { ...
}
# Location優先級如[]號顯示
匹配符 匹配規則 優先級
= 精確匹配 1
^~ 以某個字符串開頭 2
~ 區分大小寫的正則匹配 3
~* 不區分大小寫的正則匹配 4
!~ 區分大小寫不匹配的正則 5
!~* 不區分大小寫不匹配的正則 6
/ 通用匹配,任何請求都會匹配到 7
1.實例準備
[root@Nginx conf.d]# cat testserver.conf
server {
listen 80;
server_name bgx.com;
location / {
return 200 "location /";
}
location =/ {
return 200 "location =/";
}
location ~ / {
return 200 "location ~/";
}
# location ^~ / {
# return 200 "location ^~";
# }
}
2.測試效果
[root@Nginx conf.d]# curl bgx.com
location =/
//註釋掉精確匹配=, 重啟Nginx
[root@Nginx ~]# curl bgx.com
location ~/
//註釋掉~, 重啟Nginx
[root@Nginx ~]# curl bgx.com
location /
Nginx基礎應用