Apache mod_proxy (Forward/Reverse)

Apache mod_proxy (Forward/Reverse)

為了物盡其用,我們總是在一台機器上架設很多網路服務,而這些服務通常都四散在各個 Port 上,例如在 80 上有 Apache HTTPd、Tomcat 占用著 8080、RStudio Server 又裝在 8787 上,用起來十分不方便。

問題

如何將不同 Port 上的服務整合到同一個 Port 上?

舉例來說,我在 CentOS 7 上安裝了一套 RStudio Server,這是一款網頁式的 R 語言 IDE,該服務預設的 Port 是 8787,而我的 Port 80 上也已經在跑 WordPress 等服務,但是我希望能夠在不改 Port 的情況下用 URL 來區別兩個服務,像是用 http://marklee.tw/rstudio 可以連到 RStuidio Server,而不會影響到本來就正常運行的http://marklee.tw/wordpress

基礎知識

容我發懶一下,TonyQ 大大已經很好心地把文件翻譯出來,請看[心得] apache mod_proxy 介紹

解決方法

基本上,CentOS 7 的 Apache 已經內建安裝了 mod_proxy,可以在 /etc/httpd/conf/httpd.conf/etc/httpd/conf.modules.d/ 內找到,如果沒有,那可能需要安裝或啟用,請自行估狗。

首先,執行以下指令找找看是否有 <IfModule mod_proxy.c> 的標籤,如果有,請把標籤的內容反註解掉。

1
vi /etc/httpd/conf/httpd.conf

如果沒有相關的內容,請在文件結尾加入以下內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<IfModule mod_proxy.c>

<VirtualHost *:80>

<Proxy *>
Allow from localhost
</Proxy>

ProxyPass /rstudio/ http://localhost:8787/
ProxyPassReverse /rstudio/ http://localhost:8787/
RedirectMatch permanent ^/rstudio$ /rstudio/

</VirtualHost>

</IfModule>
完成後重啟 Apache
1
systemctl restart httpd.service

然後連進網址 http://ip-address/rstudio 看看有沒有通,如果出現 503 Error (Service Unavailable) 請不要驚慌,可能是 SELinux 在搞鬼,可參考Apache ProxyPass 出现 503 Service Temporarily Unavailable 的解决方案

評論