一張小圖看盡 Nginx
0x01:nginx 安裝
Nginx 安裝完成,沒有 sbin 目錄
cd 進入到 nginx-1.18.0 目錄內執行
[root@centos7 nginx-1.18.0]# ./configure --prefix=/usr/local/nginx
[root@centos7 nginx-1.18.0]# make
[root@centos7 nginx-1.18.0]# make install
ps:–prefix=path 定義一個目錄,存放服務器上的文件 ,也就是 nginx 的安裝目錄,默認使用 /usr/local/nginx
這步你會看到 local 目錄下有一個跟你安裝的 nginx1.12.2 同級的 nginx 目錄,裏面就有 sbin 目錄了。
0x02:基礎指令
listen
該指令用於配置網絡監聽。
1 listen *:80 | *:8080 #監聽所有 80 端口和 8080 端口
2 listen IP_address:port #監聽指定的地址和端口號
3 listen IP_address #監聽指定 ip 地址所有端口
4 listen port #監聽該端口的所有 IP 連接
server_name
該指令用於虛擬主機的配置。
a. 基於名稱的虛擬主機配置
server_name name ...;
b. 基於 IP 地址的虛擬主機配置
server_name 192.168.1.1
location
該指令用於匹配 URL。
location 指令的作用是根據用戶請求的 URI 來執行不同的應用,也就是根據用戶請求的網站 URL 進行匹配,匹配成功即進行相關的操作。
location 的語法
= 開頭表示精確匹配
如 A 中只匹配根目錄結尾的請求,後面不能帶任何字符串。
^~ 開頭表示 uri 以某個常規字符串開頭,不是正則匹配
~ 開頭表示區分大小寫的正則匹配;
~* 開頭表示不區分大小寫的正則匹配
/ 通用匹配, 如果沒有其它匹配, 任何請求都會匹配到
Location 正則案例
#精確匹配,/後面不能帶任何字符
server {
listen 80;
server_name www.itmayiedu.com;
#精確匹配,註解後面不能帶任何字符
location =/ {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
#匹配所有以/開頭請求
server {
listen 80;
server_name www.itmayiedu.com;
#匹配所有以/開頭請求
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
### 以開頭/itmayiedu_8080攔截 默認開啓不區分大小寫
server {
listen 80;
server_name www.itmayiedu.com;
### 以開頭/itmayiedu_8080 最終跳轉到http://127.0.0.1:8080/;
location /itmayiedu_8080/ {
proxy_pass http://127.0.0.1:8080/;
index index.html index.htm;
}
### 以開頭/itmayiedu_8080 最終跳轉到http://127.0.0.1:8081/;
location /itmayiedu_8081/ {
proxy_pass http://127.0.0.1:8081/;
index index.html index.htm;
}
}
### 開頭區分大小寫
proxy_pass
該指令用於設置被代理服務器的地址。可以是主機名稱、IP 地址加端口號的形式。
語法結構如下:
proxy_pass URL;
index
該指令用於設置網站的默認首頁。
域名重定向
server
{
listen 80 ;
server_name mxiaoqi.top aaa.com;
if ( $host = mxiaoqi.top )
#增加判斷條件,當訪問域名是mxiaoqi.top的時候
{
rewrite /(.*) http://aaa.com/$1 permanent;
#把mxiaoqi.top/後面的內容重新寫到aaa.com/後面如果後面有多段則使用$2、$3以此類推
#permanent是轉發狀態碼
}
index index.html index.htm index.php;
root /data/wwwroot/mxiaoqi.top;
}
反向代理
使用 nginx 反向代理 www.123.com 直接跳轉到 127.0.0.1:8080
server {
listen 80;
server_name www.123.com;
location / {
proxy_pass http://127.0.0.1:8080;
# 歡迎頁面,按照從左到右的順序查找頁面
index index.html index.htm index.jsp;
}
}
監聽 80 端口,訪問域名爲 www.123.com,不加端口號時默認爲 80 端口,故訪問該域名時會跳轉到 127.0.0.1:8080 路徑上。
限流配置
漏桶算法與令牌桶算法區別
主要區別在於 “漏桶算法” 能夠強行限制數據的傳輸速率,
而 “令牌桶算法” 在能夠限制數據的平均傳輸速率外,還允許某種程度的突發傳輸。在 “令牌桶算法” 中,只要令牌桶中存在令牌,那麼就允許突發地傳輸數據直到達到用戶配置的門限,因此它適合於具有突發特性的流量。
Nginx 按請求速率限速模塊使用的是漏桶算法,即能夠強行保證請求的實時處理速度不會超過設置的閾值。
-
limit_req_zone
用來限制單位時間內的請求數,即速率限制, 採用的漏桶算法 "leaky bucket"。 -
limit_req_conn
用來限制同一時間連接數,即併發限制。
limit_req_zone 參數配置
Syntax: limit_req zone=name [burst=number] [nodelay];
Default: —
Context: http, server, location
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
-
第一個參數:$binary_remote_addr 表示通過 remote_addr 這個標識來做限制,“binary_” 的目的是縮寫內存佔用量,是限制同一客戶端 ip 地址。
-
第二個參數:zone=one:10m 表示生成一個大小爲 10M,名字爲 one 的內存區域,用來存儲訪問的頻次信息。
-
第三個參數:rate=1r/s 表示允許相同標識的客戶端的訪問頻次,這裏限制的是每秒 1 次,還可以有比如 30r/m 的。
limit_req zone=one burst=5 nodelay;
-
第一個參數:zone=one 設置使用哪個配置區域來做限制,與上面 limit_req_zone 裏的 name 對應。
-
第二個參數:burst=5,重點說明一下這個配置,burst 爆發的意思,這個配置的意思是設置一個大小爲 5 的緩衝區當有大量請求(爆發)過來時,超過了訪問頻次限制的請求可以先放到這個緩衝區內。
-
第三個參數:nodelay,如果設置,超過訪問頻次而且緩衝區也滿了的時候就會直接返回 503,如果沒有設置,則所有請求會等待排隊。
ngx_http_limit_conn_module 參數配置
這個模塊用來限制單個 IP 的請求數。並非所有的連接都被計數。只有在服務器處理了請求並且已經讀取了整個請求頭時,連接才被計數。
Syntax: limit_conn zone number;
Default: —
Context: http, server, location
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /download/ {
limit_conn addr 1;
}
一次只允許每個 IP 地址一個連接。
負載均衡
#user nobody;
worker_processes 1;
error_log logs/error.log;# 開啓日誌
pid logs/nginx.pid;
...
upstream lyf {
server 192.168.37.220:8001; # 3個tomcat服務
server 192.168.37.220:8002;
server 192.168.37.220:8003;
}
server {
listen 80;
server_name 192.168.37.220;# 監聽ip
location / {
proxy_pass http://lyf; # 設置代理
index index.html index.htm;
}
}
keepalive 長連接提高吞吐量
keepalived :設置長連接處理的數量
proxy_http_version :設置長連接 http 版本爲 1.1
proxy_set_header :清除 connection header 信息
upstream tomcats {
# server 192.168.1.173:8080 max_fails=2 fail_timeout=1s;
server 192.168.1.190:8080;
# server 192.168.1.174:8080 weight=1;
# server 192.168.1.175:8080 weight=1;
keepalive 32;
}
server {
listen 80;
server_name www.tomcats.com;
location / {
proxy_pass http://tomcats;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
工作方式
-
輪詢方式是 Nginx 負載默認的方式
-
權重方式 指定每個服務的權重比例,weight 和訪問比率成正比
upstream dalaoyang-server {
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}
- iphash
每個請求都根據訪問 ip 的 hash 結果分配,經過這樣的處理,每個訪客固定訪問一個後端服務,如下配置(ip_hash 可以和 weight 配合使用)。
upstream dalaoyang-server {
ip_hash;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}
- 最少連接
將請求分配到連接數最少的服務上。
upstream dalaoyang-server {
least_conn;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}
5.fair
按後端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream dalaoyang-server {
server localhost:10001 weight=1;
server localhost:10002 weight=2;
fair;
}
Consul+upsync+Nginx 實現無需 raload 動態負載均衡
https://www.cnblogs.com/a1304908180/p/10697278.html
傳統的負載均衡,如果 Upstream 參數發生變化,每次都需要重新加載 nginx.conf 文件,
因此擴展性不是很高,所以我們可以採用動態負載均衡,實現 Upstream 可配置化、動態化,無需人工重新加載 nginx.conf。
LVS+Keepalived+Nginx+Tomcat 搭建高可用雙機主從熱備集羣
https://blog.csdn.net/dsen726/article/details/89519013
需要明確的是:
1.Nginx 兩臺是主備關係,只有一臺在工作。後面的 tomcat 是集羣,同時工作的。
2.keepalived 是同時安裝在兩臺 Nginx 上的,不過文件配置不一樣
- 這裏的雙機熱備是指 LVS,Nginx 則是集羣
keepalived
健康檢查和失敗切換是 keepalived 的兩大核心功能。所謂的健康檢查,就是採用 tcp 三次握手,icmp 請求,http 請求,udp echo 請求等方式對負載均衡器後面的實際的服務器 (通常是承載真實業務的服務器) 進行保活;而失敗切換主要是應用於配置了主備模式的負載均衡器,利用 VRRP 維持主備負載均衡器的心跳,當主負載均衡器出現問題時,由備負載均衡器承載對應的業務,從而在最大限度上減少流量損失,並提供服務的穩定性。
LVS 是 Linux Virtual Server 的簡寫,意即 Linux 虛擬服務器,是一個虛擬的服務器集羣系統。lvs 目前是集成在 Linux 內的。
爲什麼要 LVS+Nginx?
一、ngix(應用層 網絡七層負載均衡)
1、異步轉發,請求數據和相應數據都要經過 ngix,ngix 和客戶端建立連接
2、輪詢所有的 tomcat 服務器,保證請求成功或者最後一臺 tomcat 服務器也請求失敗
二、lvs(網絡層 網絡四層負載均衡)
1、同步轉發接受請求數據,lvs 轉發到服務器,服務器直接和客戶端建立連接
nginx 要承受所有的流量,當一臺 nigx 承受不了,就需要搭建 ngix 集羣。ngix+ngix 外層的 ngix 還是要承受所有流量。
lvs+ngix:lvs 同步轉發不會接受相應數據,LVS 採用 DR 模式時不用響應服務器返回的內容。(通常請求數據是比較小的,響應數據會比較大)
靜態資源配置
location ~ .*\.(jpg|gif|png)$ {
gzip on;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/javascript image/jpeg image/gif image/png;
root /usr/share/nginx/images;
}
location ~ .*\.(txt|xml)$ {
gzip on;
gzip_http_version 1.1;
gzip_comp_level 1;
gzip_types text/plain application/javascript image/jpeg image/gif image/png;
root /usr/share/nginx/code;
}
location ~ ^/download {
gzip_static on;
tcp_nopush on;
root /opt/app/code;
}
sendfile on | off,文件讀取配置
默認 sendfile 是關閉的,可以配置在 http,server,location,if in location 中
tcp_nopush on | off, 多個包整合
默認是關閉狀態,可以在 http,server,location 中配置,它的作用是在 sendfile 開啓的情況下,提高網絡包的傳輸效率。什麼意思呢,假設服務端收到請求,需要推送 10 個包,爲了提高傳輸效率,這 10 個包不會一個一個返回給客戶端,而是將 10 個包攢夠了後一起返回回去。
tcp_nodelay on | off, 網絡包的實時性傳輸
默認開啓,可以在 http,server,location 中配置,它的作用是在 keepalive 鏈接下,提高網絡包的傳輸實時性。
gzip on | off,壓縮
默認是關閉狀態,可以在 http,server,location,if in location 中配置,作用是壓縮傳輸。一般來說瀏覽器是可以對壓縮後的內容進行解壓的。
gzip_comp_level level; 壓縮級別
默認的壓縮級別是 1,可以在 http,server,location 中配置,級別配置的越高,壓縮的越好,但是壓縮會耗費服務端的計算資源,所以要控制好壓縮級別
gzip_http_version 1.0 | 1.1,壓縮對 http 協議的支持
默認對 HTTP/1.1 協議的請求才會進行 gzip 壓縮, 可以配置在 http,server,location 中配置。當用戶想要讀取一個 1.html 文件,首先會在目錄中找尋 1.html.gz 是否存在,所以這就導致了磁盤資源的浪費,必須要存儲兩份文件。
###靜態資源訪問
server {
listen 80;
server_name static.itmayiedu.com;
location /static/imgs {
root F:/;
index index.html index.htm;
}
}
###動態資源訪問
server {
listen 80;
server_name www.itmayiedu.com;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
跨域配置
跨域就是在原站點訪問域名不同的其他站點,同源策略會阻止一個域的 javascript 腳本和另外一個域的內容進行交互。所謂同源(即指在同一個域)就是兩個頁面具有相同的協議(protocol),主機(host)和端口號(port)。
CORS 是跨域資源分享(Cross-Origin Resource Sharing)的縮寫。它是 W3C 標準,屬於跨源 AJAX 請求的根本解決方法。
1、普通跨域請求:只需服務器端設置 Access-Control-Allow-Origin
2、帶 cookie 跨域請求:前後端都需要進行設置
#允許跨域請求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
#允許帶上cookie請求
add_header 'Access-Control-Allow-Credentials' 'true';
#允許請求的方法,比如 GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
#允許請求的header
add_header 'Access-Control-Allow-Headers' *;
防盜鏈
#對源站點驗證
valid_referers *.imooc.com;
#非法引入會進入下方判斷
if ($invalid_referer) { return 404; }
source: https://www.yuque.com/molizhuzhu/thrgrk/rtslmc
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/qZrJZEDJru9DjVfhPUgLPg