Nginx 反向代理多重子目錄

使用目的

架設一台 reverse proxy server 與一台 web server。當瀏覽不同的域名時,proxy server 反向代理到後端對應的主機與資料夾。

環境說明

  • Proxy Server:192.168.199.171
  • Web Server:192.168.199.172
  • 後端網站路徑:
    /www/website/aoi/
    /www/website/miyazaki/
  • 自設域名(以 /etc/hosts 新增,對應 proxy 的 192.168.199.171):
    http://aoi
    http://miyazaki

Proxy 端設定

防火牆開通

sudo firewall-cmd --add-service/http --permanent
sudo firewall-cmd --reload

SELinux 調整

sudo setsebool -P httpd_can_network_connect on

沒開的話,會出現 nginx 502 的錯誤

網站 aoi 的 nginx proxy conf 檔內容

server {
    listen       80;
    server_name  aoi;
    access_log   /var/log/nginx/${server_name}_access.log;
    error_log    /var/log/nginx/${server_name}_error.log;

    # 底下的 header 設定非必要,視後端 service 需求再使用
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Forwarded $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $server_name;

    location / {
        # 一定要設定 Host 的 header,用固定名稱或變數皆可
        proxy_set_header Host $server_name;

        # 用域名導向到後端的同名資料夾中
        proxy_pass http://192.168.199.172/$server_name/;

        # 不指定路徑的話,就改用下面的設定直接導向後端預設路徑
        # proxy_pass http://192.168.199.172/;
    }
}

網站 miyazaki 的 nginx proxy conf 檔內容

server {
    listen       80;
    server_name  miyazaki;
    access_log   /var/log/nginx/${server_name}_access.log;
    error_log    /var/log/nginx/${server_name}_error.log;

    # 底下的 header 設定非必要,視後端 service 需求再使用
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Forwarded $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $server_name;

    location / {
        # 一定要設定 Host 的 header,用固定名稱或變數皆可
        proxy_set_header Host $server_name;

        # 用域名導向到後端的同名資料夾中
        proxy_pass http://192.168.199.172/$server_name/;

        # 不指定路徑的話,就改用下面的設定直接導向後端預設路徑
        # proxy_pass http://192.168.199.172/;
    }
}

Web 端設定

防火牆開通

sudo firewall-cmd --add-service/http --permanent
sudo firewall-cmd --reload

建立網頁存放的資料夾與網頁檔

sudo mkdir -p /www/website/aoi /www/website/miyazaki
echo "Aoi" | sudo tee /www/website/aoi/index.html
echo "Miyazaki" | sudo tee /www/website/miyazaki/index.html

調整網頁路徑的 SELinux

sudo chcon -R -t httpd_sys_rw_content_t /www/website/

如果沒有調的話,網頁會出現找不到檔案的 403 錯誤

網站 aoi 的 nginx web conf 檔內容

server {
    listen       80;
    server_name  aoi;
    access_log   /var/log/nginx/${server_name}_access.log;
    error_log    /var/log/nginx/${server_name}_error.log;

    location / {
        root /www/website;
    }
}

網站 miyazaki 的 nginx web conf 檔內容

server {
    listen       80;
    server_name  miyazaki;
    access_log   /var/log/nginx/${server_name}_access.log;
    error_log    /var/log/nginx/${server_name}_error.log;

    location / {
        root /www/website;
    }
}

測試反向代理

打開瀏覽器測試 http://aoi 與 http://miyazaki

可以看到網址連到 192.168.199.171,但連線後顯示的是 192.168.199.172 上的網頁檔,表示反向代理設定成功!

心得

只要網站資料夾的目錄名稱與 log 名稱都用到域名來命名,nginx config 就可以大量的使用 server_name 變數,每個不同 config 只要更改 server_name 即可,在佈署多個網站時可以簡化很多流程。

acidjazz Written by:

2 Comments

  1. ED
    11/11/2020
    Reply

    讚啦 簡單明瞭!

    • acidjazz
      12/10/2020

      哈哈哈 但有點簡陋

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。