### Reverse proxy (反向代理服務器)
Reverse proxy 是指由代理伺服器接收了來自 internet 的訪問,然後會把訪問轉發給內聯網上的伺服器,然後把伺服器回傳的結果返回給 internet 的使用者。而這個代理伺服器的工作就是 reverse proxy 了。
### 為什麼要使用 reverse proxy
很多時我們的服務器是不會直接連上 internet 的,而是由一個 firewall 來分隔開 internet 和 intranet,以確保服務器的安全。所以我們需要一個 reverse proxy 來為各種不同服務的請求分流到不同的伺服器上。
### Nginx
Nginx 除是可以成為網站伺服器外,還可以作為一個 reverse proxy。只需要在 config 檔案內設定好就可以了。
設定檔位置 : `/etc/nginx/site-availables/default`
先來看一個最普通的設定:
```text
# 設定 1 個 server 設置
server {
# 監聽 port 80
listen 80 default_server;
listen [::]:80 default_server;
# 監聽 port 443 (使用 ssl 設定)
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
# 設定 ssl 使用的證書及密匙
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
# 設定監聽的 domain (可以多於 1 個)
server_name _;
# 設定文件的根目錄
root /var/www/html/;
# 設定預設要存取的文件
index index.htm index.html index.php index.nginx-debian.html;
}
```
我們把上面的設定檔修改一下,刪除下面這兩個設定 :
```text
root /var/www/html/;
index index.htm index.html index.php index.nginx-debian.html;
```
然後在原有的位置加入下面的設定 :
```text
# 指定收到 url 的工作
location / {
# 加入額外的 http header
proxy_set_header X-Forwarded-For $remote_addr;
# 加入額外的 http header
proxy_set_header Host $http_host;
# 把訪問移交到目標伺服器
proxy_pass https://localhost:8080;
}
```
下面是完整的設定檔 :
```text
# 設定 1 個 server 設置
server {
# 監聽 port 80
listen 80 default_server;
listen [::]:80 default_server;
# 監聽 port 443 (使用 ssl 設定)
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
# 設定 ssl 使用的證書及密匙
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
# 設定監聽的 domain (可以多於 1 個)
server_name _;
# 指定收到 url 的工作
location / {
# 加入額外的 http header
proxy_set_header X-Forwarded-For $remote_addr;
# 加入額外的 http header
proxy_set_header Host $http_host;
# 把訪問移交到目標伺服器
proxy_pass https://localhost:8080;
}
}
```
經過上面的設定,就可以把來自 port 80 的訪問轉發到同一主機的 port 8080 上去了。