nginx實現常見場景

Nginx是一款輕量級的HTTP服務器,採用事件驅動的異步非阻塞處理方式框架,這讓其具備極好的IO性能。咱們在平常開發中使用到Nginx的主要有如下幾個場景:
css

  • Nginx做爲http服務器
  • 跨域請求
  • 負載均衡
  • 網絡資源的動靜分離

nginx做爲http服務器

Nginx自己是一個靜態資源的服務器,當只有靜態資源的時候,就可使用Nginx來作服務器,以下,咱們使用Nginx來部署一個打包好的vue項目
html

#vue項目
server
{
     listen 8081; #監聽端口
     server_name 209.250.235.145; 
     root /app/vue/dist/; # 咱們的資源在服務器中的路徑
     index index.html; #指定資源的入口文件
}複製代碼

完成後咱們nginx -s reload一下,而後訪問209.250.235.145:8081,只要路徑沒錯靜態資源就訪問的到了vue


跨域請求

先後端分離的項目中因爲先後端項目分別部署到不一樣的服務器上,咱們首先遇到的問題就是跨域,在這個場景咱們下nginx能夠幫助咱們很好地解決這個問題

#跨域請求server
server{
	listen 9000;
	server_name 209.250.235.145;
	root /app/crossDomain/;
	index index.html;
	
	location /douban/ { #添加訪問目錄爲/apis的代理配置
		rewrite   ^/douban/(.*)$ /$1 break;
		proxy_pass   https://m.douban.com;
   }
}
複製代碼

在個人服務器下我寫了一個node

index.html請求豆瓣接口,模擬跨域

function nginxClick(){
	$.ajax({
		url: '/douban/rexxar/api/v2/muzzy/columns/10018/items?start=0&count=3',
		dataType: 'json',
		type: 'get',
		data: "",
		success:(res)=>{
		    console.log(res)
		}
	})
}
複製代碼

當咱們訪問點擊請求時,匹配到location下的/douban/nginx

rewrite   ^/douban/(.*)$ /$1 break;複製代碼

這段配置將請求路徑重寫爲/rexxar/api/v2/muzzy/columns/10018/items?start=0&count=3,其中$1表明正則模糊匹配到的第一個參數,web

proxy_pass   https://m.douban.com;複製代碼

這段配置是將請求域名代理到豆瓣的域名下面,因此從本地服務器發出去的請求將被從新重寫爲:ajax

https://m.douban.com/rexxar/api/v2/muzzy/columns/10018/items?start=0&count=3,咱們就能拿到豆瓣api提供的數據。詳情能夠看看這篇文章
json

演示地址:http://209.250.235.145:9000/後端

負載均衡

負載均衡也是Nginx經常使用的一個功能,主要的是利用upstream來定義集羣服務器。負載均衡配置通常都須要同時配置反向代理,經過反向代理跳轉到負載均衡。而Nginx目前支持自帶3種負載均衡策略api

  • RR(默認):每一個請求按時間順序逐一分配到不一樣的後端服務器,若是後端服務器down掉,能自動剔除
  • 權重:指定輪詢概率,weight和訪問比率成正比,用於後端服務器性能不均的狀況
  • ip_hash:上面的2種方式都有一個問題,那就是下一個請求來的時候請求可能分發到另一個服務器,當咱們的程序不是無狀態的時候(採用了session保存數據),這時候就有一個很大的很問題了,好比把登陸信息保存到了session中,那麼跳轉到另一臺服務器的時候就須要從新登陸了,因此不少時候咱們須要一個客戶只訪問一個服務器,那麼就須要用iphash了,iphash的每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。
這裏用第二900種策略來模擬實現了下負載均衡(同一臺服務器上的兩個端口起了兩個node服務。)


使用upstream定義服務器 

upstream smile.com{	
	server 209.250.235.145:9001 weight=1;
	server 209.250.235.145:9002 weight=2;
}複製代碼

server{
	listen  9003;
	server_name 209.250.235.145;
	
	location / {
		proxy_pass		http://smile.com;
		proxy_redirect 		default;
	}
}複製代碼

當咱們訪問9003這個端口時,會根據咱們設置的權重不一樣分別落在不一樣的服務器(端口)。




演示地址:http://209.250.235.145:9003/

網絡資源的動靜分離

當咱們的請求涉及靜態資源時,咱們能夠將請求分發到不一樣的服務器。

#動靜分離server
    upstream static {
	    server 209.250.235.145:9006;
    }
    server{
        listen 9005;
	    server_name 209.250.235.145;
	    root /app/dynSta;
		
	    location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
            proxy_pass http://static;
        }
    }
    server{
        listen 9006;
	   server_name 209.250.235.145;
	   root /app/dynSta;
    }
複製代碼

咱們定義了一個

爲靜態資源新增了一個端口,並添加到
upstream模塊,當咱們的location匹配到以 (gif|jpg|jpeg|png|bmp|swf|css|js)結尾的文件時,咱們都會把請求轉發到9006這個端口下(好想成爲土豪,好想擁有兩臺服務器啊啊啊啊。。)

nginx除了以上的使用場景外,還能夠用來適配pc和移動環境

適配pc和移動環境

#適配pc環境和移動環境
	server{
		listen 9007;
		server_name 209.250.235.145;
		root /app/pcAndh5/;
		index pc.html;
		
		location / {
			if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
				set $mobile_request '1';
			}
			if ($mobile_request = '1') {
				rewrite ^.+ https://www.baidu.com/;
				
			}
        }
    }
複製代碼

這裏咱們使用nginx內置變量$http_user_agent來匹配請求的來源,當來源是(Android|webOS|iPhone|iPod|BlackBerry)時,咱們將請求整個重寫,讓他去訪問百度,不然訪問我服務器的地址。

演示地址:http://209.250.235.145:9007/

以上就是nginx服務器在咱們平常開發中使用到的場景

相關文章
相關標籤/搜索