Nginx目錄索引
Nginx默認是不允許列出整個目錄瀏覽下載,
要求
當用戶訪問 http://game.nfsnobody.com/ 直接訪問我們的游戲
當用戶訪問 http://game.nfsnobody.com/centos 跳轉到我們centos的目錄
如果開啟了目錄的索引
上傳的檔案,只看該檔案的修改時間,
如果本地創建,則和服務器時間進行保持,
例子
autoindex on;
開啟目錄索引
autoindex_exact_size off;
默認為on, 顯示出檔案的確切大小,單位是bytes,
修改為off,顯示出檔案的大概大小,單位是kB或者MB或者GB,
autoindex_localtime on;
默認為off,顯示的檔案時間為GMT時間,
修改為on, 顯示的檔案時間為檔案的服務器時間,
charset utf-8,gbk;
默認中文目錄亂碼,添加上解決亂碼,
實體
[root@web01 centos]# cat /etc/nginx/conf.d/nfsnobody_game.conf
server {
listen 80;
server_name game.nfsnobody.com;
charset utf-8,gbk;
location / {
root /nfsnobody_code;
index index.html;
}
location /centos {
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
root /nfsnobody_code;
}
}
Nginx狀態監控
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;
}
使用瀏覽器訪問http://IP/nginx_status訪問后得到的結果
Active connections:2 #當前活動的連接數
server accepts handled requests
16 16 19
16 # 總的tcp連接數connection
16 # 成功tcp連接數connection(失敗連接=(總連接數-成功連接數))
19 # 總共處理的http請求數requests
# keepalive_timeout 0; 每次連接都會產生一次請求(短連接)
# keepalive_timeout 60; 在60s以內的請求建立在一個連接基礎之上(長連接)
Reading:2 Writing:1 Waiting: 19
Reading #請求
Writing #回應
Waiting #等待的請求數,開啟了keepalive
Nginx訪問控制
基于IP的訪問控制 http_access_module
基于用戶登陸認證 http_auth_basic_module
基于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, 其他全部允許
deny 10.0.0.1/32;
allow all;
2.訪問控制配置示例, 只允許誰能訪問, 其它全部拒絕
allow 127.0.0.1;
deny all;
基于IP地址的缺點

解決方式
1.采用HTTP頭資訊控制訪問, 代理以及web服務開啟http_x_forwarded_for
2.結合geo模塊作
3.通過HTTP自定義變數傳遞
基于用戶密碼
//配置語法
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
1.安裝hhtpd-tools,需要使用到htpaaswd這個命令生成密碼
[root@web01 conf.d]# yum install httpd-tools -y
[root@web01 conf.d]# htpasswd -b -c /etc/nginx/auth_conf nfsnobody nfsnobody
2.加入需要做認證的location模塊
auth_basic "Gun Dan!!!!";
auth_basic_user_file /etc/nginx/auth_conf;
用戶認證局限性
1.用戶資訊依賴檔案方式
2.用戶管理檔案過多, 無法聯動
3.操作管理機械,效率低下
解決辦法
1.Nginx結合LUA實作高效驗證
2.Nginx結合LDAP利用nginx-auth-ldap模塊
參考fj.nfsnobody.com
location / {
root /code; # 指定網站代碼存放的位置
autoindex on; # 開啟目錄索引
autoindex_localtime on; # 開啟本地服務器的時間
autoindex_exact_size off; # 以人性化方式顯示檔案大小
access_log off; # 關閉訪問日志
auth_basic "Permission denied"; # 基礎認證的描述資訊
auth_basic_user_file /etc/nginx/auth_conf; # 基礎認證密碼檔案位置(驗證)
}
Nginx訪問限制
經常會遇到這種情況,服務器流量例外,負載過大等等,對于大流量惡意的攻擊訪問, 會帶來帶寬的浪費,服務器壓力,影響業務,往往考慮對同一個ip的連接數,并發數進行限制,
ngx_http_limit_conn_module模塊可以根據定義的key來限制每個鍵值的連接數,如同一個IP來源的連接數,
訪問限制型別
limit_conn_module 連接頻率限制 基于TCP連接數限制(不準)
limit_req_module 請求頻率限制 基于http請求數限制 1s 30http
http協議的連接與請求

注:客戶端的IP地址作為鍵,
$remote_addr 變數的長度為7位元組到15位元組
$binary_remote_addr 變數的長度是固定的4位元組
如果共享記憶體空間被耗盡,服務器將會對后續所有的請求回傳 503錯誤 (Service Temporarily Unavailable)
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
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日志配置
只要出錯一定要日志!!!
日志里面的每一列都是什么意思
Nginx有非常靈活的日志記錄模式,每個級別的配置可以有各自獨立的訪問日志,日志格式 通過log_format命令定義格式,
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地址和客戶端請求的服務器地址,
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.nfsnobody.com.log;
...
Nginx虛擬站點
什么是虛擬站點
所謂虛擬主機,及在一臺服務器上配置多個網站
如: 公司主頁、博客、論壇看似三個網站, 實則可以運行在一臺服務器上,
Nginx虛擬主機(多Server標簽)
定義多個網站
基于IP的多網站 (毫無卵用)
基于埠的多網站 (一般)
基于域名的多網站
基于域名的多網站 (最關鍵)
創建web站點目錄
[root@nfsnobody ~]# mkdir /soft/code/{www,bbs}
[root@nfsnobody ~]# echo "www" > /soft/code/www/index.html
[root@nfsnobody ~]# echo "bbs" > /soft/code/bbs/index.html
配置不同域名的虛擬主機
[root@nfsnobody ~]# cat /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.nfsnobody.com;
root /soft/code/www;
index index.html;
...
}
[root@nfsnobody ~]# cat /etc/nginx/conf.d/bbs.conf
server {
...
listen 80;
server_name bbs.nfsnobody.com;
root /soft/code/bbs;
index index.html;
}
基于埠的配置
基于埠的多網站 (一般)
1.如果網站都是使用不同的埠訪問,那使用域名和不使用域名沒有什么影響,
注意:只在公司內部才會使用到,
//僅修改listen監聽埠即可, 但不能和系統埠出現沖突
server {
...
listen 8001;
...
}
server {
...
listen 8002;
...
}
基于虛擬主機別名配置
實作用戶訪問多個域名對應同一個網站, 比如用戶訪問www.nfsnobody.com和訪問nfsnobody.com內容一致
默認配置方式
[root@nfsnobody ~]# vim /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.nfsnobody.com;
}
server {
listen 80;
server_name nfsnobody.com;
}
使用別名配置方式
[root@nfsnobody ~]# vim /etc/nginx/conf.d/www.conf
server {
listen 80;
server_name www.nfsnobody.com nfsnobody.com;
...
}
測驗訪問,
帶www和不帶www是一樣的
[root@nfsnobody ~]# curl nfsnobody.com
Go
[root@nfsnobody ~]# curl www.nfsnobody.com
Go
Nginx Location
使用Nginx Location控制訪問網站規則
一個server可以有多個location配置,但多個location配置的優先級又該如何劃分
Location語法規則:
location [=|^||*|!|!~*|/] /uri/ { ...
}
location優先級別
Location優先級如[]號顯示
| 匹配符 | 匹配規則 | 優先級 |
|---|---|---|
| = | 精確匹配 | 1 |
| ^~ | 以某個字串開頭 | 2 |
| ~ (常用) | 區分大小寫的正則匹配 | 3 |
| ~* (常用) | 不區分大小寫的正則匹配 | 4 |
| !~ | 區分大小寫不匹配的正則 | 5 |
| !~* | 不區分大小寫不匹配的正則 | 6 |
| / (常用) | 通用匹配,任何請求都會匹配到 | 7 |
通用匹配,任何請求都會匹配到
location / {
}
實體準備測驗
實體準備
[root@Nginx conf.d]# cat testserver.conf
server {
listen 80;
server_name nfsnobody.com;
location / {
return 200 "location /";
}
location =/ {
return 200 "location =/";
}
location ~ / {
return 200 "location ~/";
}
# location ^~ / {
# return 200 "location ^~";
# }
}
測驗效果
[root@Nginx conf.d]# curl nfsnobody.com
location =/
//注釋掉精確匹配=, 重啟Nginx
[root@Nginx ~]# curl nfsnobody.com
location ~/
//注釋掉~, 重啟Nginx
[root@Nginx ~]# curl nfsnobody.com
location /
常用的匹配規則
嚴格區分大小寫,匹配以.php結尾的都走這個location
location ~ \.php$ {
fastcgi_pass http://127.0.0.1:9000;
}
嚴格區分大小寫,當用戶訪問/.zip結尾,統統全部拒絕
location ~ \.zip$ {
deny all;
}
不區分大小寫匹配,只要用戶訪問.jpg,gif,png,js,css 都走這條location
location ~* .*\.(jpg|gif|png|js|css)$ {
root /code/nfsnobody;
expires 7d;
#rewrite (.*) http://cdn.nfsnobody.com$request_uri;
}
不區分大小寫匹配,
location ~* "\.(sql|bak|tgz|tar.gz|.git)$" {
return 403 "啟用訪問控制成功";
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/145045.html
標籤:Linux
上一篇:LAMP環境搭建和配置(2)
