02 nginx經常使用模塊

 

企業中網站的安全訪問配置

a. 根據用戶訪問的地址進行控制   Nginx實現基於ip的訪問控制功能:(Ngx_http_access_module)javascript

官方文檔:http://nginx.org/en/docs/http/ngx_http_access_module.html
官方示例:
The ngx_http_access_module module allows limiting access to certain client addresses.限定資源只被指定的客戶端訪問。
Example Configuration:
location / {
    deny  192.168.1.1;        #自上而下檢測,匹配範圍小的在上面
    allow 192.168.1.0/24;
    allow 10.1.1.0/16;
    allow 2001:0db8::/32;
    deny  all;
}
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  #適用配置段

10.0.0.0/24 www.mxxl.com/gota/ 不能訪問
172.16.1.0/24 www.mxxl.com/gota/ 能夠訪問
第一個歷程: 編寫配置文件
[root@web01 conf.d]# vim www.conf php

server {
    listen 80;
    server_name www.mxxl.com;
    location / {
        root /html/www;
        index index.html;
    }
    location /gota {
        deny 10.0.0.0/24;  #禁止
        allow 172.16.1.0/24; #容許
        root /html/www;
        index index.html;
    }
}            

補充: location外面的信息, 全局配置信息 ;location裏面的信息, 局部配置信息css

b 根據用戶訪問進行認證  nginx認證模塊: ngx_http_auth_basic_module

Example Configuration
location / {
    auth_basic           "closed site";  #開啓認證功能
    auth_basic_user_file conf/htpasswd;  #加載用戶密碼文件
}
Directives
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


第一個歷程: 編寫虛擬主機配置文件 html

server {
    listen 80;
    server_name www.oldboy.com;
    location / {
        root /html/www;
        index index.html;
        auth_basic "oldboy-sz-01";
        auth_basic_user_file password/htpasswd;
}    

 

第二個歷程: 建立密碼文件(文件中密碼信息必須是密文的)
htpasswd 建立一個有密文信息的密碼文件
[root@web01 conf.d]# rpm -qf `which htpasswd`
httpd-tools-2.4.6-89.el7.centos.x86_64java

[root@web01 nginx-1.16]# htpasswd -cb password/htpasswd gota 123456
Adding password for user gota
[root@web01 nginx-1.16]# cat password/htpasswd
gota:$apr1$De.drvif$VNuHFsViBt2HpYzWpyPiK.
[root@web01 nginx-1.16]#mv password conf/nginx

-c Create a new file. *****
建立一個密碼文件
-n Don't update file; display results on stdout.
不會更新文件; 顯示文件內容信息
-b Use the password from the command line rather than prompting for it. *****
免交互方式輸入用戶密碼信息
-i Read password from stdin without verification (for script usage).
讀取密碼採用標準輸入方式,並不作檢查 ???
-m Force MD5 encryption of the password (default).
md5的加密算法
-B Force bcrypt encryption of the password (very secure).
使用bcrypt對密碼進行加密 
-C Set the computing time used for the bcrypt algorithm
(higher is more secure but slower, default: 5, valid: 4 to 31).
使用bcrypt algorithm對密碼進行加密
-d Force CRYPT encryption of the password (8 chars max, insecure).
密碼加密方式
-s Force SHA encryption of the password (insecure).
加密方式
-p Do not encrypt the password (plaintext, insecure).
不進行加密
-D Delete the specified user.
刪除指定用戶
-v Verify password for the specified user.
htpasswd命令參數說明

修改密碼文件權限: ???  #安全問題
chmod 600 ./htpasswd

500 Internal Server Error
01. 內部程序代碼編寫有問題
02. 程序服務中文件權限不正確

curl命令參數:
-u, --user USER[:PASSWORD] Server user and password
[root@web01 password]# curl www.mxxl.com -u gota
Enter host password for user 'gota':
10.0.0.7 www.mxxl.com
[root@web01 password]# curl www.mxxl.com -u mxxl:123456
10.0.0.7 www.mxxl.comweb

C.  Nginx 隱藏版本號和信息

查看http請求的response裏面的header咱們會發現有server這個參數,它表示服務端使用的是什麼web服務器。正則表達式

例如   原文連接:https://blog.csdn.net/weixin_42104231/article/details/83653987算法

   新浪網:Server:nginxjson

  開源中國:Server:Tengine

segmentfault甚至都沒有返回server!

  Nginx默認是顯示版本號的。這樣就給人家看到你的服務器nginx的真實版本號,前些時間暴出了一些Nginx版本漏洞,就是說有些版本有漏洞,而有些版本沒有。這樣暴露出來的版本號就容易變成攻擊者可利用的信息。因此,從安全的角度來講,隱藏版本號會相對安全些!

[root@proxy ~]# curl -i 192.168.4.5
HTTP/1.1 200 OK
Server: nginx/1.12.2
        那nginx版本號能夠隱藏不?其實能夠的,看下面的步驟(nginx + php)

1 進入nginx配置文件的目錄(此目錄根據安裝時決定)nginx.conf,用vim編輯打開。

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf

http {
include mime.types;
default_type application/octet-stream;

server_tokens off;
#### 在http節點下加入server_tokens off;便可
}

2 編輯php-fpm配置文件fastcgi.conf 和 fastcgi_params. 

  在沒有修改以前的字段內容:fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;   

[root@proxy ~]# vim /usr/local/nginx/conf/fastcgi.conf
fastcgi_param SERVER_SOFTWARE nginx;
[root@proxy ~]# vim /usr/local/nginx/conf/fastcgi_params
fastcgi_param SERVER_SOFTWARE nginx;
3 從新加載nginx配置:

[root@proxy ~]# nginx -s reload
4 再次測試可以發現版本號對外已經徹底隱藏了

[root@proxy ~]# curl -i 192.168.4.5
HTTP/1.1 200 OK
Server: nginx
 

Nginx的企業實踐應用

1) 利用nginx服務搭建網站文件共享服務器
第一個步驟: 編寫配置文件(www.conf)
a. nginx模塊功能: ngx_http_autoindex_module
Syntax: autoindex on | off;
Default:
autoindex off;
Context: http, server, location

server {
    listen       80;
    server_name  localhost;
    location / {
        root   html/gota;
        #index  index.html index.htm;  #註釋掉這行
        autoindex on;  #開啓nginx站點目錄索引功能
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
配置文件

注意:
1. 須要將首頁文件(例如html/gota/index.html)進行刪除
2. mime.types 媒體資源類型文件做用(裏面記錄了nginx支持的文件類型)
文件中有的擴展名信息資源, 進行訪問時會直接看到數據信息(直接打開,若是不想直接打開就將其註釋或刪掉)
文件中沒有的擴展名信息資源, 進行訪問時會直接下載資源

[root@web01 nginx-1.16]# vim conf/mime.types

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
#    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    font/woff                                        woff;
    font/woff2                                       woff2;

    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
                                                     pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
                                                     xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
                                                     docx;
    application/vnd.wap.wmlc                         wmlc;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;

    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;

    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;

    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;
}
註釋txt測試一下

[root@web01 nginx-1.16]# ./sbin/nginx -s stop
[root@web01 nginx-1.16]# ./sbin/nginx


網站頁面目錄數據,中文出現亂碼,如何解決:

    location / {
       root  /html/www;
       #index index.html;
       auth_basic      "oldboy-sz-01";
       auth_basic_user_file password/htpasswd;
       autoindex on;
       charset utf-8;   --- 修改目錄結構中出現的中文亂碼問題
     }
    
修改目錄結構中出現的中文亂碼問題


2) 利用nginx服務搭配置文件別名功能
第一個歷程: 編寫配置文件
server_name www.oldboy.com old.com;
第二個歷程: 配置好解析信息
做用:
01. 編寫網站訪問測試
02. 定位要訪問的網站服務器

 

3) 利用nginx狀態模塊功能對網站進行監控   b. 狀態模塊: ngx_http_stub_status_module

location = /basic_status {
  stub_status;
}#官方實例

 


第一個歷程: 編寫配置文件
[root@web01 nginx-1.16]# vim conf.d/server.conf

server {
    listen       80;
    server_name  localhost;
    location / {
        root   html/gota;
        #index  index.html index.htm;
        autoindex on;  #開啓nginx站點目錄索引功能
    }
    location /nginx_status {
        stub_status on;   #開啓狀態監測
        access_log off;     #關閉訪問日誌
        allow 10.192.27.0/25;  #容許指定網段
        deny all; #拒接全部
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

第二個歷程: 重啓nginx服務,而且編寫解析文件
systemctl reload nginx 

訪問


Active connections: 激活的鏈接數信息 4000用戶 3500  #當前正在鏈接的總數 (此參數關鍵  後期監控用)
accepts: 接收的鏈接數彙總(綜合) TCP  
handled: 處理的鏈接數彙總(綜合) TCP
requests: 總計的請求數量 HTTP協議請求  #客戶端的請求總數 (客戶端在很短的時間屢次請求,只創建一次鏈接) 不必定請求和處理成功 (請求數高於當服務器併發量,或出現等待)
Reading: nginx服務讀取請求報文的數量 100人點餐
Writing: nginx服務響應報文信息數量 100人響應
Waiting: nginx隊列機制等待處理的,要處理(讀取或者響應保存進行保存) 監控  (此參數關鍵  後期監控用)

 

 


4) nginx日誌功能配置
訪問日誌: /var/log/nginx/access.log     c. 訪問日誌模塊:ngx_http_log_module

log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';   #定義日誌內容格式
access_log /var/log/nginx/access.log main;  #調用日誌格式

10.192.27.71 - gota [29/Oct/2019:10:45:23 +0800] "GET /gota.txt HTTP/1.1"   304  0      "http://10.192.27.111/"   "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"

10.192.33.24 - - [29/Oct/2019:13:55:32 +0800] "GET / HTTP/1.1"   200   374    "-"        "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36"

$remote_addr 顯示用戶訪問源IP地址信息
$remote_user 顯示認證的用戶名信息
[$time_local] 顯示訪問網站時間
"$request" 請求報文的請求行信息
$status 用戶訪問網站狀態碼信息
$body_bytes_sent 顯示響應的數據尺寸信息(服務器給客戶端口的文件大小  例如index.html的大小)
$http_referer 記錄調用網站資源的鏈接地址信息(防止用戶盜鏈)   # 京東nginx---access.log---某個廣告(xxx---京東圖片連接)---http_referer(連接)
$http_user_agent 記錄用戶使用什麼客戶端軟件進行訪問頁面的 (谷歌 火狐 IE 安卓 iphone)
$http_x_forwarded_for ??? 負載均衡

 

錯誤日誌: /var/log/nginx/error.log  d. 錯誤日誌模塊 Core functionality  #http://nginx.org/en/docs/ngx_core_module.html

Syntax:    error_log file [level]; 指定錯誤日誌路徑以及錯誤日誌記錄的級別
Default:    error_log logs/error.log error;
Context:    main, http, mail, stream, server, location

error_log /var/log/nginx/error.log warn;

debug    :調試級別, 服務運行的狀態信息和錯誤信息詳細顯示 信息越多
info :信息級別, 只顯示重要的運行信息和錯誤信息
notice :通知級別: 更加劇要的信息進行通知說明
warn :警告級別: 可能出現了一些錯誤信息,但不影響服務運行
error    :錯誤級別: 服務運行已經出現了錯誤,須要進行糾正 推薦選擇
crit :嚴重級別: 必須進行修改調整
alert :嚴重警告級別: 即警告,並且必須進行錯誤修改
emerg :災難級別: 服務已經不能正常運行 信息越少
錯誤日誌級別

 

PS: 日誌文件信息須要作切割處理 幾個G

 


5) nginx服務location做用說明
d. 模塊說明: ngx_http_core_module
location進行匹配( uri 統一資源標識符 )

location /oldboy {
    root html/www;
    error_page 404 /oldboy.jpg;
}
location /oldgirl {
    root html/www;
    error_page 404 /oldgirl.jpg;
}
錯誤頁面優雅顯示

location詳細配置(官方實例):

Syntax:    location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default:    —
Context:    server, location
location = / { --- 精確匹配 優先級01 最高
[ configuration A ]
}

location / { --- 默認匹配 優先級04 最低
[ configuration B ]
}

location /documents/ { --- 按照目錄進行匹配 優先級03
[ configuration C ]
}

location ^~ /images/ { --- 優先匹配/不識別uri信息中符號信息 優先級02
[ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ { --- 不區分大小寫進行匹配 優先級03
[ configuration E ]
}

 

1. location正則寫法  #參考於 http://seanlook.com/2015/05/17/nginx-location-rewrite/

一個示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
location  = / {
# 精確匹配 / ,主機名後面不能帶任何字符串
[ configuration A ]
}

location / {
# 由於全部的地址都以 / 開頭,因此這條規則將匹配到全部請求
# 可是正則和最長字符串會優先匹配
[ configuration B ]
}

location /documents/ {
# 匹配任何以 /documents/ 開頭的地址,匹配符合之後,還要繼續往下搜索
# 只有後面的正則表達式沒有匹配到時,這一條纔會採用這一條
[ configuration C ]
}

location ~ /documents/Abc {
# 匹配任何以 /documents/Abc 開頭的地址,匹配符合之後,還要繼續往下搜索
# 只有後面的正則表達式沒有匹配到時,這一條纔會採用這一條
[ configuration CC ]
}

location ^~ /images/ {
# 匹配任何以 /images/ 開頭的地址,匹配符合之後,中止往下搜索正則,採用這一條。
[ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
# 匹配全部以 gif,jpg或jpeg 結尾的請求
# 然而,全部請求 /images/ 下的圖片會被 config D 處理,由於 ^~ 到達不了這一條正則
[ configuration E ]
}

location /images/ {
# 字符匹配到 /images/,繼續往下,會發現 ^~ 存在
[ configuration F ]
}

location /images/abc {
# 最長字符匹配到 /images/abc,繼續往下,會發現 ^~ 存在
# F與G的放置順序是沒有關係的
[ configuration G ]
}

location ~ /images/abc/ {
# 只有去掉 config D 纔有效:先最長匹配 config G 開頭的地址,繼續往下搜索,匹配到這一條正則,採用
[ configuration H ]
}

location ~* /js/.*/\.js
  • =開頭表示精確匹配
    如 A 中只匹配根目錄結尾的請求,後面不能帶任何字符串。
  • ^~ 開頭表示uri以某個常規字符串開頭,不是正則匹配
  • ~ 開頭表示區分大小寫的正則匹配;
  • ~* 開頭表示不區分大小寫的正則匹配
  • / 通用匹配, 若是沒有其它匹配,任何請求都會匹配到

順序 no優先級:
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)

上面的匹配結果
按照上面的location寫法,如下的匹配示例成立:

  • / -> config A
    精確徹底匹配,即便/index.html也匹配不了
  • /downloads/download.html -> config B
    匹配B之後,往下沒有任何匹配,採用B
  • /images/1.gif -> configuration D
    匹配到F,往下匹配到D,中止往下
  • /images/abc/def -> config D
    最長匹配到G,往下匹配D,中止往下
    你能夠看到 任何以/images/開頭的都會匹配到D並中止,FG寫在這裏是沒有任何意義的,H是永遠輪不到的,這裏只是爲了說明匹配順序
  • /documents/document.html -> config C
    匹配到C,往下沒有任何匹配,採用C
  • /documents/1.jpg -> configuration E
    匹配到C,往下正則匹配到E
  • /documents/Abc.jpg -> config CC
    最長匹配到C,往下正則順序匹配到CC,不會往下到E
實際使用建議
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
因此實際使用中,我的以爲至少有三個匹配規則定義,以下:
#直接匹配網站根,經過域名訪問網站首頁比較頻繁,使用這個會加速處理,官網如是說。
#這裏是直接轉發給後端應用服務器了,也能夠是一個靜態首頁
# 第一個必選規則
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二個必選規則是處理靜態文件請求,這是nginx做爲http服務器的強項
# 有兩種配置模式,目錄匹配或後綴匹配,任選其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
#第三個規則就是通用規則,用來轉發動態請求到後端應用服務器
#非靜態文件請求就默認是動態請求,本身根據實際把握
#畢竟目前的一些框架的流行,帶.php,.jsp後綴的狀況不多了
location / {
proxy_pass http://tomcat:8080/
}

http://tengine.taobao.org/book/chapter_02.html
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html


 

 

 

 


6) 利用nginx實現頁面跳轉功能
e.利用rewrite模塊是跳轉功能: http_rewrite_module

Syntax:    rewrite regex replacement [flag]; rewite 匹配的正則信息 替換成什麼信息
Default:    —
Context:    server, location, if

 


rewrite www.oldboy.com/(.*) http://www.oldboy.com/$1 permanent; 重寫規則配置
^/ (.*)
baidu.com / oldboy.html 跳轉方式
www.baidu.com/oldboy.html
跳轉方式:
永久跳轉: permanent 301 會將跳轉信息進項緩存
臨時跳轉: redirect 302 不會緩存跳轉信息

出現無限跳轉如何解決:
第一種方法: 利用不一樣server區塊配置打破循環
server {
server_name oldboy.com;
rewrite ^/(.*) http://www.oldboy.com/$1 permanent;
}
第二種方法: 利用if判斷實現打破循環
if ($host ~* "^oldboy.com$") {
rewrite ^/(.*) http://www.oldboy.com/$1 permanent;
}

www.oldboy.com/oldboy01/oldboy02/oldboy.jpg --- www.oldboy.com/oldboy.jpg

相關文章
相關標籤/搜索