《鬼谷八荒攻略》洪荒難度定氣拳刮痧Build參考
目錄
1. nginx
簡介
Nginx
是一款基於非同步框架的輕量級/高效能的Web伺服器/反向代理伺服器/快取伺服器/電子郵件代理伺服器,並在BSD-like協議下發行。由俄羅斯程式設計師Igor Sysoev
所開發,最初供俄國大型網站Rambler.ru
Nginx
特點:
優點:
- 高併發
- 記憶體消耗少
- 簡單穩定
- 支援
Rwrite
重寫規則 - 低成本
- 支援多系統
缺點:
- 動態處理差
- rewrite弱
2. Nginx
常用命令小記
常用命令:
# ubuntu使用ssh連線伺服器: ssh [email protected]: # 然後按提示輸入密碼 # 安裝nginx sudo apt install nginx # 檢視nginx版本: nginx -v # 檢視是否處於執行狀態 ps jx |grep nginx # 關閉nginx服務 service nginx stop # 開啟nginx服務 service nginx start # nginx配置檔案目錄:/etc/nginx/ # nginx的log日誌目錄: /var/log/nginx/ # nginx預設首頁目錄: /usr/share/nginx/html/index.html # 檢視nginx是否成功 # 測試nginx配置是否正確: nginx -t # 重新載入配置資訊 nginx -s reload
Nginx
配置圖解:
3. VScode
遠端連線虛擬機器上的ubuntu
系統
sudo apt install openssh-server
# 修改配置允許遠端連線
cd /etc/ssh/
sodu vim sshd_config
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-fAD3HeDx-1620542439365)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210508181026750.png)]
將PermitRootlogin
取消註釋並確保為yes
。
4. location中的常見動作
4.1 nginx
匹配路徑後斜槓問題
當location /path 後面不加斜槓時,訪問時無論請求加不加斜槓請求都能夠被匹配到。如:
location /a {
return 400;
}
請求路徑最後加不加斜槓都能匹配到。
如果加了斜槓後,訪問時加斜槓才能被匹配到,不加斜槓不會被匹配到。
4.2 try_files和return的使用和區別
location / {
try_files $uri $uri/ =401;
}
try_files不能匹配根路徑,如上面這種配置訪問不會出現401。下面的這種可以訪問。
location /a {
try_files $uri $uri/ =401;
}
try_files配合@使用
location /a {
try_files $uri $uri/ @project
}
location @project {
return 402;
}
return 的使用跳轉
location / {
return 302 http://www.baidu.com;
}
4.3 root
和alias
的區別:
針對根路徑:
location / {
root /etc/nginx/html;
# 指定返回的首頁檔案(預設返回index.html檔案)
# index index.html
index 指定的.html檔案
}
# 如果使用root可以匹配,如果不是root,則匹配不了,如果是alias,需要增加斜槓結尾。
location / {
alias /etc/nginx/html/;
}
針對子路徑的話:root屬性在子路徑下不能使用(404),應該使用alias屬性
location /a {
alias /etc/nginx/html;
# 指定
}
4.4 訪問控制
location / {
stub_stutas on; # 返回nginx狀態資訊
allow 10.212.12.34; # 指定哪些ip可以訪問
deny all; # 除了允許的,其他都拒絕。
}
4.5 目錄下載功能
location /download {
alias /etc/nginx; # 指定下載目錄
autoindex on; # 開啟下載模式
}
5. 反向代理
正向代理轉發:將客戶端的資訊進行了隱藏
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-R9YSLI8y-1620542439375)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210509100155797.png)]
反向代理轉發:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-yVl1D2r3-1620542439380)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210509100303240.png)]
反向代理的是伺服器端,可以隱藏伺服器端的資訊。
server{
listen 10.211.23.29:80;
location / {
proxy_pass http://10.211.23.29:8000;# 轉發給8000埠
}
}
server{
listen 10.211.23.29:8000; # 由8000埠重新進行操作。
location / {
root /etc/nginx/html;
index. index.html;
}
}
6. 負載均衡
當多次請求時,將比較均衡地轉發給upsteam my_project
中的地址
# 負載均衡
upsteam my_project {
# 預設輪訓
server 10.211.23.29:8000;
server 10.211.23.29:8001;
server 10.211.23.29:8002;
# 加權輪訓
server 10.211.23.29:8000 weight=1;
server 10.211.23.29:8001 weight=2;
server 10.211.23.29:8002 weight=3;
# ip_hash 第一次請求會分配一個伺服器端的ip,以後的所有請求都是使用第一的服務ip
ip_hash;
server 10.211.23.29:8000;
server 10.211.23.29:8001;
server 10.211.23.29:8002;
}
# 反向代理
server {
listen 10.211.23.29:80;
location / {
proxy_pass http://my_project
}
}
server {
listen 10.211.23.29:8000;
location / {
root /etc/nginx/html;
index 8000.html;
}
}
server {
listen 10.211.23.29:8000;
location / {
root /etc/nginx/html;
index 8001.html;
}
}
server {
listen 10.211.23.29:8000;
location / {
root /etc/nginx/html;
index 8002.html;
}
}
7. 日誌解析
日誌功能簡介
日誌簡介
Nginx
預設提供了兩個日誌檔案 access.log
和error.log
,通過access.log
可以得到使用者請求的相關資訊;通過error.log
可以獲取某個web服務故障或其效能瓶頸等資訊。
而且nginx
的日誌支援定製化格式,這樣我們就可以根據實際的業務情況更好的高效工作。最常見的場景就是獲取客戶端的IP
,記錄使用者訪問量。
官方介紹:http://nginx.org/en/docs/http/ngx_http_log_module.html
基本配置
# cat /etc/nginx/nginx.conf -n
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
注意:
nginx
日誌屬性設定的完整格式是:
屬性名稱 access_log
儲存位置 /var/log/nginx/access.log
日誌格式 位置為空表示使用預設的combined 日誌格式。它是通過log_format設定的
預設日誌格式
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
注意:log_format
是有一批nginx
內建變數組合而成的。
日誌樣式:
\# tail /var/log/nginx/access.log
192.168.8.14 - - [12/Nov/2018:08:24:18 -0800] "GET /favicon.ico HTTP/1.0" 404 580 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
**nginx
常用內建變數 **
nginx
常用的內建變數主要是用來分析日誌中的http
記錄的,我們可以根據內建的變數精確的獲取相關的資訊
# 預設變數
$remote_addr 前一臺主機的ip地址,不一定是真實的客戶端IP
$remote_user 用於記錄遠端客戶端的使用者名稱稱(一般為“-”)
$time_local 用於記錄訪問時間和時區
$request 用於記錄請求的url以及請求方法
$status 響應狀態碼,例如:200成功、404頁面找不到等。
$body_bytes_sent 給客戶端傳送的檔案主體內容位元組數
$http_referer 可以記錄使用者是從哪個連結訪問過來的
$http_user_agent 使用者所使用的代理(一般為瀏覽器)
其他常用變數
$request_uri 包含請求引數的原始URI,不包含主機名
$uri 不帶請求引數的當前URI,不包含主機名
$http_x_forwarded_for 可以記錄客戶端IP,通過代理伺服器來記錄客戶端的ip地址
$http_x_real_ip 可以記錄客戶端IP,通過代理伺服器來記錄客戶端的ip地址
$args 這個變數等於請求行中的引數,同$query_string
$host 請求主機頭欄位,否則為伺服器名稱。
$scheme HTTP方法(如http,https)
$document_uri 與$uri相同
$document_root 當前請求檔案配置檔案中html的根目錄即root值
$request_filename 當前請求的檔案路徑,由root或alias指令與URI請求生成
示例:
例:http://localhost:10086/sswang1/sswang2/test.txt
$host localhost
$server_port 10086
$request_uri /sswang1/sswang2/test.txt
$document_uri /sswang1/sswang2/test.txt
$document_root /var/www/html
$request_filename /var/www/html/sswang1/sswang2/test.txt
自定義日誌實踐
需求:
基於代理方式訪問app1
應用,日誌存放在/var/logs/nginx/app1/access.log,要求能從日誌中獲取客戶端的IP地址
因為是獲取代理前面客戶端的真實IP,需要nginx
開啟 --with-http_realip_module 功能,使用nginx -V來檢查,ubuntu預設安裝的已經開啟了該功能。
設定日誌格式
~# vim /etc/nginx/nginx.conf
# Logging Settings
## 設定日誌格式的方法: log_format 格式名稱 "日誌表現樣式"
log_format proxy_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_real_ip" "$http_x_forwarded_for"';
access_log 日誌路徑 格式名稱;
負載均衡配置檔案
vim /etc/nginx/conf.d/upstream.conf
upstream backends {
server 192.168.8.14:10086;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backends;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
後端代理配置檔案
vim /etc/nginx/conf.d/backend.conf
server {
listen 192.168.8.14:10086;
root /var/www/html/app1/;
access_log /var/log/nginx/app1/access.log proxy_format;
real_ip_header X-Forwarded-For;
set_real_ip_from 192.168.0.0/16;
real_ip_recursive on;
location / {
try_files $uri $uri/ =404;
}
}
準備後端服務檔案
mkdir -p /var/www/html/app1/
echo '<h1>backend_app1</h1>' > /var/www/html/app1/index.html
mkdir /var/log/nginx/app1 -p
檢查nginx
配置後重載服務
/usr/sbin/nginx -t
systemctl reload nginx
netstat -tnulp | grep nginx
檢視效果
在多臺主機上執行如下命令
curl http://192.168.8.14
檢視日誌:
# app1日誌
192.168.8.1 - - [12/Nov/2018:18:28:46 -0800] "GET / HTTP/1.0" 200 22 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" "192.168.8.1" "192.168.8.1"
192.168.8.14 - - [12/Nov/2018:18:29:30 -0800] "GET / HTTP/1.0" 200 22 "-" "curl/7.47.0" "192.168.8.14" "192.168.8.14"
192.168.8.15 - - [12/Nov/2018:18:31:43 -0800] "GET / HTTP/1.0" 200 22 "-" "curl/7.29.0" "192.168.8.15" "192.168.8.15
注意:因為我們的虛擬機器使用的是nat網路模型,所以我們用外部的宿主機來訪問的話,是通過VMnat8網絡卡IP來訪問nginx代理的,所以記錄的是192.168.8.1
注意:
如果生產中出現了多級代理,
在第一層代理上新增 proxy_set_header X-Real-IP $remote_addr;屬性
在所有代理上必須新增 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;屬性
真實主機上使用 real_ip_header X-Forwarded-For;屬性