Nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器;同時也是一個IMAP、POP3、SMTP代理服務器;Nginx可以作爲一個HTTP服務器進行網站的發佈處理,另外Nginx可以作爲反向代理進行負載均衡的實現。我就介紹幾個我在工作中用到的nginx的反向代理功能。
代理本地目錄
這個需求是比如vue項目或者h5 要發佈到服務器上,這時候就用到了nginx ,因爲nginx處理靜態資源非常的nice,我們就會代理一個目錄。
server {
listen 8002;
server_name localhost;
root /usr/local/path;
location / {
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
如果是做圖片代理訪問也是可以的
server {
listen 8088;
server_name 127.0.0.1;
location / {
root /home/image;
autoindex on;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
注意
有些同學在使用linux服務器代理圖片訪問的時候可能出現了403這樣的錯誤,解決方式有兩種
- 在nginx.conf 中加入
user root
即可 - 授予訪問目錄755 權限
代理域名
有這樣一個需求,a.fulinlin.com
要訪問服務器裏的項目A ,而b.fulinlin.com
要訪問服務器裏的項目B,這時候該怎麼辦呢,服務器只有一個80端口,此時呢可以用nginx解決
server {
listen 80;
server_name a.fulinlin.com;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://ip:端口/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name b.fulinlin.com;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://ip:端口/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
這樣配置就能做到 訪問 不用的域名或者二級域名跳轉到不同的項目裏。
代理路徑
有這樣一個需求,假設有一個域名www.fulinlin.com
想實現www.fulinlin.com/wiki
和 www.fulinlin.com/bolg
這樣區分訪問兩個項目,怎麼辦到呢? 其實呢不難配置
server {
listen 80;
server_name www.fulinlin.com;
location /wiki {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://ip:端口/;
}
location /blog {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://ip:端口/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
ssl證書代理
此時呢,項目經理想做道 https
套ssl證書訪問網站,這時候怎麼辦呢?沒關係nginx還能解決
server {
listen 443 ssl;
server_name localhost;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://ip:端口/;
}
}
填寫證書相應的 pem和key即可 。
但是呢領導還有需求 怎麼辦到訪問http
的時候跳轉到https
呢 ? 那麼nginx還能幫你解決 只用在80里加一行代碼即可。
server {
listen 80;
server_name localhost;
rewrite ^(.*)$ https://${server_name}$1 permanent;
}
動靜分離
ngxin還有個強大的地方就是代理靜態資源超快。以下配置的意思是 訪問80 代理到 tomcat下,然後訪問到 js|css|ico|png|jpg|eot|svg|ttf|woff
相應的文件後,會去/var/lib/project/static
下去訪問,或者就是去另一個專門放靜態資源的服務器去訪問。
server{
listen 80;
server_name localhost;
location / {
index index;
#指向tomcat
proxy_pass http://ip:端口;
}
location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
#簡單點說我們弄了一臺服務器放置靜態資源,然後通過這個路徑進行代理過去
# proxy_pass http://ip:端口;
#所有靜態文件直接讀取硬盤
root /var/lib/project/static ;
#緩存30天
expires 30d;
}
#其他頁面反向代理到tomcat容器
location ~ .*$ {
index index;
proxy_pass http://ip:端口;
}
}
限流
Nginx爲我們提供了請求限制模塊(ngx_http_limit_req_module)
、基於令牌桶算法的流量限制模塊(ngx_stream_limit_conn_module)
,可以方便的控制令牌速率,自定義調節限流,實現基本的限流控制。
請求限制的功能來自於 ngx_http_limit_req_module
模塊。使用它需要首先在 http 配置段中定義限制的參照標準和狀態緩存區大小。
-
limit_req_zone
只能配置在http
範圍內; -
$binary_remote_addr
表示客戶端請求的IP地址; -
mylimit
自己定義的變量名; -
rate
請求頻率,每秒允許多少請求; -
limit_req
與limit_req_zone
對應,burst
表示緩存住的請求數,也就是任務隊列。
下面的配置就是定義了使用客戶端的 IP 作爲參照依據,並使用一個 10M 大小的狀態緩存區。結尾的 rate=1r/s 表示針對每個 IP 的請求每秒只接受一次。
10M 的狀態緩存空間夠不夠用呢?官方給出的答案是 1M 的緩存空間可以在 32 位的系統中服務 3.2 萬 IP 地址,在 64 位的系統中可以服務 1.6 萬 IP 地址,所以需要自己看情況調整。如果狀態緩存耗光,後面所有的請求都會收到 503(Service Temporarily Unavailable) 錯誤。
# 定義了一個 mylimit 緩衝區(容器),請求頻率爲每秒 1 個請求(nr/s)
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
listen 80;
location / {
# nodelay 不延遲處理
# burst 是配置超額處理,可簡單理解爲隊列機制
# 上面配置同一個 IP 沒秒只能發送一次請求(1r/s),這裏配置了緩存3個請求,就意味着同一秒內只能允許 4 個任務響應成功,其它任務請求則失敗(503錯誤)
limit_req zone=mylimit burst=3 nodelay;
proxy_pass http://localhost:7070;
}
}
負載均衡
假設有這樣一個需求,服務A要做集羣, 這時候假設有 192.168.8.100:8080
和 192.168.8.101:8080
這兩個服務,要做負載怎麼辦呢?nginx可以做到
http {
upstream linuxidc {
server 192.168.8.100:8080;
server 192.168.8.101:8080;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://linuxidc;
}
}
}
這樣呢負載均衡就設置完畢了,但是是輪訓的,有沒有什麼更好的負載放生呢?
weight(權重)
指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。例如以下所看到的。192.168.8.101
的訪問比率要比192.168.8.100
的訪問比率高一倍。
upstream linuxidc{
server 192.168.8.100:8080;
server 192.168.8.101:8080;
}
ip_hash(訪問ip)
每一個請求按訪問ip的hash結果分配。這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。
upstream favresin{
ip_hash;
server 192.168.8.100:8080;
server 192.168.8.101:8080;
}
fair(第三方)
需要安裝模塊, 按後端服務器的響應時間來分配請求。響應時間短的優先分配。
upstream favresin{
server 192.168.8.100:8080;
server 192.168.8.101:8080;
fair;
}
url_hash(第三方)
按訪問url的hash結果來分配請求,使每一個url定向到同一個後端服務器。後端服務器爲緩存時比較有效。
注意:在upstream中加入hash語句。server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法。
upstream resinserver{
server 192.168.8.100:8080;
server 192.168.8.101:8080;
hash $request_uri;
hash_method crc32;
}
細節配置
upstream還能夠爲每一個設備設置狀態值,這些狀態值的含義分別例如以下:
-
down 表示單前的server臨時不參與負載.
-
weight 默覺得1.weight越大,負載的權重就越大。
-
max_fails :同意請求失敗的次數默覺得1.當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤.
-
fail_timeout : max_fails次失敗後。暫停的時間。
-
backup: 其他全部的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。
upstream bakend{
#定義負載均衡設備的Ip及設備狀態
ip_hash;
server 192.168.8.100:8080 down;
server 192.168.8.101:8080 weight=2;
server 192.168.8.102:8080;
server 192.168.8.103:8080 backup;
}
怎麼安裝模塊
上面說到好多什麼第三方 模塊啥的 ,那麼到底怎麼安裝第三方模塊呢?
去github 尋找響應的模塊安裝包然後來 就可以安裝了。以fair爲栗子。
未安裝的nginx
配置:
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --add-module=/home/nginx-upstream-fair-master
編譯安裝
make && make intstall
安裝過Nginx
切換到nginx目錄執行一下操作
配置
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --add-module=/home/nginx-upstream-fair-master
編譯
make
複製nginx
cp objs/nginx /usr/local/nginx/nginx
注意事項
已安裝nginx,配置第三方模塊時,只需要--add-module=/
第三方模塊目錄,然後make編譯一下就可以,不要 make install
安裝。編譯後複製objs下面的nginx到指定目錄下。
這知識介紹了我學習中常用的一點點配置,其實還有很多非常複雜的配置實現更復雜的功能,哈哈但是我不會,慢慢學習補充吧 0.0