這裡介紹如何在 CentOS Linux 中變更 Nginx 網頁伺服器的傾聽連接埠,使用非標準的連接埠進行網頁開發與測試。

標準的網頁伺服器會使用 80 或是 8080 作為傾聽連接埠,而在開發與測試系統或網站時,有時候會將測試用的網頁伺服器安裝在非標準的連接埠上,跟正式的網頁伺服器有所區隔。


以 Nginx 網頁伺服器的設定檔來說,可以從 server 中的 listen 參數來調整傾聽的連接埠。

server {
  # 自訂網頁伺服器連接埠
  listen       8090 default_server;
  listen       [::]:8090 default_server;

  # [略]
}

而在 CentOS Linux 中,若直接將 Nginx 的傾聽連接埠改為非標準的連接埠的話,可能會出現 Permission denied 的錯誤訊息。

2018/10/29 10:40:26 [emerg] 20879#0: bind() to 0.0.0.0:8090 failed (13: Permission denied)

這個錯誤是來自於 SELinux 限制 HTTP 服務只能使用幾個標準的連接埠,避免惡意程式亂開服務,產生系統漏洞。

如果想要解決這個問題,可以使用 semanage 這個小工具,調整一下 SELinux 的設定。而使用前要先用 yum 安裝:

# 安裝 semanage(SELinux policy 管理工具)
sudo yum install policycoreutils-python

安裝好了 semanage 之後,可以先查看一下系統上目前允許 HTTP 服務使用的連接埠有哪些:

# 列出允許 HTTP 服務使用的連接埠
sudo semanage port -l | grep http_port_t
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000

在預設的情況下,SELinux 只允許 HTTP 服務使用一些常見的連接埠,不果我們指定連接埠不在這個允許列表中,就會出現 Permission denied 的錯誤。

若要讓 HTTP 服務使用 8090 這個自訂的連接埠號,可以將這個連接埠號加入 http_port_t 列表中:

# 允許 HTTP 服務使用 8090 連接埠
sudo semanage port -a -t http_port_t -p tcp 8090

再檢查一次,確認 8090 有在允許使用的連接埠之內:

# 列出允許 HTTP 服務使用的連接埠
sudo semanage port -l | grep http_port_t
http_port_t                    tcp      8090, 80, 81, 443, 488, 8008, 8009, 8443, 9000

這樣就可以讓 Nginx 網頁伺服器正常使用 8090 這個連接埠了。

參考資料:serverfault