### 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 上去了。