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
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.
修改密碼文件權限: ??? #安全問題
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
查看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
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; }
[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 = / { |
=
開頭表示精確匹配^~
開頭表示uri以某個常規字符串開頭,不是正則匹配順序 no優先級:
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)
上面的匹配結果
按照上面的location寫法,如下的匹配示例成立:
1 |
因此實際使用中,我的以爲至少有三個匹配規則定義,以下: |
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