1. 程式人生 > >Nginx基礎應用

Nginx基礎應用

war str tex 實戰 連接數 def 註釋 一秒 字符

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基礎應用