Nginx 教程二:利用nginx搭建靜態檔案服務、正向代理伺服器、反向代理伺服器

卜算發表於2017-09-10

使用 Nginx 來提供靜態檔案服務

Nginx 一大經典使用場景就是用來提供靜態檔案服務,例如圖片、html、指令碼、樣式檔案等,這些檔案沒有必要交給 tomcat、jboss等應用伺服器處理,使用 Nginx 直接處理將大大提高效能。用 Nginx 來提供靜態檔案服務十分簡單,只需要新增一個 server 塊指令即可。

假設我們的靜態檔案位於 /srv/www 目錄下,有若干圖片、html、指令碼、樣式等檔案,在 http 指令中加入一個 server 指令即可,程式碼如下

1
2
3
4
5
6
7
8
9
#其他配置省略
...
http {
      server {
         location ~* \.(html|css|js|png|jpg|gif|ico)$ {
            root/srv/www;
         }
      }
}

location指令用來對映請求到本地檔案系統,這裡我們使用了簡單的正規表示式來匹配html、css、js、png、jpg、gif、ico這些為副檔名的請求,注意 location 指令中使用表示式要用 ~ 或者 ~* 符號指明,~表示區分大小寫,~* 表示不區分大小寫。而 root 指令用來指定檔案在伺服器上的基路徑,這裡指定為 /srv/www。

不是太好理解,舉個例子,例如客戶端傳送了一個 GET 請求 http://localhost/images/logo.png,Nginx 接受到該請求後會將該請求分發到匹配的 location 中處理,顯然上面我們寫的 location 指令可以截獲該請求,接下來 nginx 將 request_uri 和 root 拼接成伺服器檔案系統路徑,這裡 request_uri 為 /images/logo.png,root 為 /srv/www ,拼接後路徑為 /srv/www/images/logo.png ,最後 nginx 將伺服器該圖片響應給客戶端,如果不存在該檔案,則返回 404 。

使用 Nginx 來提供正向代理伺服器

① Nginx 另外一大經典使用場景就是用來作為代理伺服器,通常和上述的靜態檔案伺服器配合使用,來完成靜態檔案由 nginx 伺服器提供,而複雜業務請求則由後面的應用伺服器來處理。

配置 nginx 為代理伺服器也很簡單,同樣在 http 上下文中新增一個 server 指令即可,這裡我們以 tomcat 為例

1
2
3
4
5
6
7
8
9
10
11
12
13
#其他配置省略
http {
  server {
     #靜態檔案由nginx處理
     location ~* \.(html|css|js|png|jpg|gif|ico)$ {
         root/srv/www;
     }
     #其他所有請求由tomcat處理
     location / {
         proxy_pass http://localhost:8080;
     }

  }
}

使用 proxy_pass 指令即可將匹配的請求轉發到相應的代理伺服器。這裡我們同時配置了兩個 location,第一個 location 來截獲靜態檔案請求並將請求直接交給 nginx 處理,第二個 location 來截獲除了靜態檔案之外的其他所有請求並將這些請求交給 tomcat 處理。這是 nginx 非常經典的使用方式。

② 正向代理是通常所說的代理,是某臺電腦通過一臺伺服器來上Internet網的這種方式,,其中這臺電腦叫客戶機,這臺伺服器叫正向代理伺服器,也是通常所說的代理伺服器。一般情況下,客戶機必須制定代理伺服器(IE瀏覽器可在工具→Internet選項→連線→區域網設定→代理伺服器中設定)。

 2.1 Nginx正向代理配置檔案

user www;
worker_processes 1;
error_log /var/log/nginx/error.log debug;

events {
	use epoll;
	worker_connections 1024;
}

http {
	resolver 8.8.8.8;
	server {
		listen 8088;
		location / {
			proxy_pass http://$http_host$request_uri;
		}
	}
}


以上配置的注意事項:

設定nginx代理服務,一般是配置到一個server塊中。注意,在該server塊中,不要出現server_name指令,即不要設定虛擬主機的名稱和IP。而resolver是必需的,如果沒有該指令,nginx無法處理接收到的域名。其次,nginx代理服務不支援正向代理HTTPS站點。
1,不能有hostname。
2,必須有resolver, 即dns,即上面的x.x.x.x,換成當前機器的DNS伺服器ip即可(檢視dns方法 cat /etc/resolv.conf 代理使用)
3,$http_host和$request_uri是nginx系統變數,保持原樣即可。


2.2 配置完成後,重啟Nginx使配置生效。然後,你可以在IE瀏覽器選單中的“工具”→“Interner選項”→“連線”→“區域網設定”→“代理伺服器”

中設定代理伺服器IP地址和埠,如圖11-6所示。



使用Nginx提供反向代理伺服器

利用nginx把請求轉發到真正的遠端後臺伺服器上,然後後臺伺服器返回資料給nginx,nginx收到資料後再返回給我們頁面。這種技術一般成為請求轉發或者叫反向代理。下面放出一張nginx的配置圖

配置很簡單這裡大概給大家講一下重點部分,

1、location 支援配置專案的絕對路徑

2、假設我們的後臺API地址是以API開頭,location ^~ /api/ 代表nginx將會攔截請求地址中包含"/api/"字樣的請求,其實這就是我們的ajax請求路徑,攔截到請求之後根據寫法會分成兩種情況把這個請求轉發到 下面 proxy_pass 的地址上。

  舉個例子:

a、如上圖,如果proxy_pass 的URL以 / 結尾 ,那麼請求轉發的時候 將 不會 帶上 匹配到的 /api/ ,也就是說如果 登入請求 URL是 localhost:60001/api/user/login,proxy_pass  URL 是 http://a.xx.com:8080/platform/, Nginx將會 把這個請求轉發成 http://a.xx.com:8080/platform/user/login 

b、如果proxy_pass 的URL不以 / 結尾 ,那麼請求轉發的時候 將 會帶上 匹配到的 /api/ ,也就是說如果 登入請求 URL是 localhost:60001/api/user/login,proxy_pass  URL 是 http://a.xx.com:8080/platform/, Nginx將會 把這個請求轉發成 http://a.xx.com:8080/platform/api/user/login 

3、一般我們登入之後伺服器會通過Set-Cookie把token寫回到我們本地,如果不設定 proxy_cookie_path 的話,伺服器Set-Cookie命令會失效,本地存不了cookie,從而導致token丟失。

這裡proxy_cookie_path有一點需要注意的是 如果 proxy_pass  URL 是 http://a.xx.com:8080/platform/ 這種情況  proxy_cookie_path應該設定成 /platform/ / (注意兩個斜槓之間有空格)。

如果 proxy_pass  URL 是 http://a.xx.com:8080/這種情況  proxy_cookie_path應該設定成 / / (注意兩個斜槓之間有空格)

重啟下nginx,你就會發現一切都正常了。


原文地址:

靜態資源伺服器:http://www.cnblogs.com/1995hxt/p/6100202.html

location配置的解釋: http://www.cnblogs.com/lidabo/p/4169396.html

反向代理:http://blog.csdn.net/cjd6568358/article/details/51871039

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
userwww;
worker_processes1;
error_log/var/log/nginx/error.logdebug;
 
events{
useepoll;
worker_connections1024;
}
 
http{
resolver8.8.8.8;
server{
listen8088;
location/{
proxy_passhttp://$http_host$request_uri;
}
}
}

相關文章