nginx 常用用法

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/wikiwww.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_reqlimit_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:8080192.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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章