反向代理服務-Nginx
一、Nginx簡介
Nginx
是一個很強大的高效能Web和反向代理服務,它具有很多非常優越的特性:
- Nginx專為效能優化而開發,效能是其最重要的考量,實現上非常注重效率。其優點是佔有記憶體少,併發能力強,能夠支援高達 50,000 個併發連線數的響應。
- Nginx作為負載均衡服務:Nginx 既可以在內部直接支援 Rails 和 PHP 程式對外進行服務,也可以支援作為 HTTP代理服務對外進行服務。
- 處理靜態檔案,索引檔案以及自動索引;開啟檔案描述符緩衝。
- 無快取的反向代理加速,簡單的負載均衡和容錯。
- 模組化的結構。
二、Docker下安裝Nginx
2.1 安裝思路
步驟一:啟動一個臨時的nginx;
步驟二:拷貝nginx配置至需要掛載的本地目錄;
步驟三:建立並執行新的nginx容器。
2.2 具體執行步驟
```shell
1. 建立要掛載的配置目錄。
$ mkdir -p /mydata/nginx/conf
2. 啟動臨時nginx容器。
$ docker run -p 80:80 --name nginx -d nginx:1.10
3. 拷貝出 Nginx 容器的配置。
3.1 將nginx容器中的nginx目錄複製到本機的/mydata/nginx/conf目錄。
$ docker container cp nginx:/etc/nginx /mydata/nginx/conf
3.2 複製的是nginx目錄,將該目錄的所有檔案移動到 conf 目錄。
$ mv /mydata/nginx/conf/nginx/* /mydata/nginx/conf/
3.3 刪除多餘的 /mydata/nginx/conf/nginx目錄。
$ rm -rf /mydata/nginx/conf/nginx
4. 刪除臨時nginx容器。
4.1 停止執行 nginx 容器。
$ docker stop nginx
4.2 刪除 nginx 容器。
$ docker rm nginx
5. 啟動新的 nginx 容器。
$ docker run -p 80:80 --name nginx \ -v /mydata/nginx/html:/usr/share/nginx/html \ -v /mydata/nginx/logs:/var/log/nginx \ -v /mydata/nginx/conf/:/etc/nginx \ -d nginx:1.10
6. 設定 nginx 隨 Docker 啟動。
$ docker update nginx --restart=always ```
2.3 測試是否安裝成功
- 修改
index
頁展示效果
```shell $ echo '
hello nginx!
' \/mydata/nginx/html/index.html ```
- 通過
yourIp
進行頁面訪問
三、Nginx反向代理
3.1 什麼是反向代理?
在介紹什麼是反向代理之前,我們首先了解一下正向代理。
Nginx
不僅可以做反向代理,實現負載均衡,還能用作正向代理來進行上網等功能。
- 正向代理 :
- 概念:如果把區域網外的
Internet
想象成一個巨大的資源庫,則區域網中的客戶端要訪問Internet
,則需要通過代理伺服器來訪問,這種代理服務就稱為正向代理。 - 應用場景:由於工作環境原因,日常工作只能侷限於單位的區域網,如果想要訪問網際網路,怎麼辦呢?這時就需要用到正向代理,讓代理伺服器幫助我們進行資源的訪問。(需要在客戶端配置代理伺服器進行指定網站訪問)
- 反向代理:
- 概念:其實客戶端對代理是無感知的,因為客戶端不需要任何配置就可以訪問。我們只需要將請求傳送到反向代理伺服器,由反向代理伺服器去選擇目標伺服器獲取資料後,在返回給客戶端,此時反向代理伺服器和目標伺服器對外就是一個伺服器,暴露的是代理伺服器地址,隱藏了真實伺服器
IP
地址。 - 應用場景:我們要訪問網站時無需知道具體的伺服器
IP
,而是通過域名訪問代理伺服器,代理服務再來幫我們進行請求轉發。 - 正向代理及反向代理示意圖:
3.2 配置檔案
3.2.1 檢視配置:
```shell
切換至配置檔案所在目錄。
$ cd /mydata/nginx/conf/
檢視配置檔案。
$ cat nginx.conf ```
3.2.2 配置說明:
```conf
主程序叫master,負責管理子程序,子程序叫worker
worker_processes配置項表示開啟幾個業務程序,一般和cpu核數有關
worker_processes 1;
events { worker_connections 1024; }
http { # include表示可以引入其他檔案,此處表示引入http mime型別 include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65;
# 虛擬主機,可以配置多個
server {
listen 80;
server_name localhost;
location / {
# 路徑匹配之後,哪個目錄下去匹配相應的網頁,html是相對路徑
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
```
3.2.3 第一部分:全域性塊:
conf
worker_processes 1;
說明:
- 從配置檔案開始到
events 塊
之間的內容,主要會設定一些影響Nginx
伺服器整體執行的配置指令。 -
主要包括:配置執行
Nginx
伺服器的使用者(組)、允許生成的worker process
數,程序PID
存放路徑、日誌存放路徑和型別以及配置檔案的引入等。 -
上面這行
worker_processes
配置,是Nginx
伺服器併發處理服務的關鍵配置,該值越大,可以支援的併發處理量也越多,但是會受到硬體、軟體等裝置的制約。
3.2.4 第二部分:events 塊:
conf
events {
worker_connections 1024;
}
說明:
events
塊涉及的指令主要影響Nginx
伺服器與使用者的網路連線。-
常用的設定包括:是否開啟對多
work process
下的網路連線進行序列化,是否允許同時接收多個網路連線,選取哪種事件驅動模型來處理連線請求,每個work process
可以同時支援的最大連線數等 -
上述例子就表示每個
work process
支援的最大連線數為 1024。這部分的配置對Nginx
的效能影響較大,在實際中應該靈活配置。
3.2.5 第三部分:http 塊:
```conf http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
} ```
說明:
-
這算是
Nginx
伺服器配置中最頻繁的部分,代理、快取和日誌定義等絕大多數功能和第三方模組的配置都在這裡。 -
需要注意的是:
http 塊
也可以包括http全域性塊
、server 塊
。 -
http全域性塊:配置的指令包括檔案引入、MIME-TYPE 定義、日誌自定義、連線超時時間、單鏈接請求數上限等。
-
server 塊:這塊和虛擬主機有密切關係,虛擬主機從使用者角度看,和一臺獨立的硬體主機是完全一樣的,該技術的產生是為了 節省網際網路伺服器硬體成本。每個
http 塊
可以包括多個server 塊
,而每個server 塊
就相當於一個虛擬主機。而每個server 塊
也分為全域性 server 塊
,以及可以同時包含多個locaton 塊
。 - 全域性 server 塊:最常見的配置是本虛擬機器主機的監聽配置和本虛擬主機的名稱或
IP
配置。 - location 塊:一個 server 塊可以配置多個 location 塊。主要作用是基於
Nginx
伺服器接收到的請求字串(例如 server_name/uri-string),對虛擬主機名稱 (也可以是IP 別名)之外的字串(例如 前面的 /uri-string)進行匹配,對特定的請求進行處理。 地址定向、資料快取和應答控制等功能,還有許多第三方模組的配置也在這裡進行。
3.2.6 一圖說明nginx.conf配置:
3.3 反向代理實踐
3.3.1 需求:使用 Nginx
反向代理,訪問 www.123.com 直接跳轉到 127.0.0.1:8080。
3.3.2 示意圖:
3.3.3 實踐過程
- 步驟一:修改hosts檔案,配置域名和 ip 對應關係:
```tex
hosts檔案路徑
C:\Windows\System32\drivers\etc ```
- 步驟二:配置nginx監聽:
說明:
nginx
反向代理服務監聽192.168.8.8
的80
埠,如果有請求過來,則轉到proxy_pass
配置的對應伺服器上。
```conf server { listen 80; server_name 192.168.8.8;
location / {
root html;
index index.html index.htm;
proxy_pass http://127.0.0.1:8080
}
} ```
- 步驟三:瀏覽器訪問測試:
說明:不加埠號時預設為
80
埠。
四、結束語
“-------怕什麼真理無窮,進一寸有一寸的歡喜。”
微信公眾號搜尋:餃子泡牛奶。