Linux的SELinux安全性控制除做用於文件系統外還做用於端口,這使得那些做爲服務啓動的進程只能在規定的幾個端口上監聽。爲敘述方便咱們稱之爲受控端口。nginx
要查看當前有哪些受控端口可執行:安全
# semanage port -l | grep '^http_port_t' http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
這裏顯示了八個端口號,其中包括80端口。因爲nginx默認在80端口監聽所以啓動正常。socket
# service nginx start
咱們接下來可作個試驗,看看nginx可否在其它端口上監聽,好比8888端口。爲此新加/etc/nginx/conf.d/test.conf文件:tcp
# /etc/nginx/conf.d/test.conf server { listen 8888; server_name localhost; }
你也能夠不新加本文件,而是直接修改/etc/nginx/conf.d/default.conf文件。ui
完成後讓nginx從新加載配置:spa
# nginx -s reload
雖然該命令執行成功,但實際上8888端口並未處於監聽狀態:代理
# netstat -anp | grep 8888
上面的netstat命令無輸出,這代表8888端口不在監聽狀態。進一步咱們查看一下審計日誌:日誌
vi /var/log/audit/audit.log
在文件尾部發現以下兩行:code
1 type=AVC msg=audit(1452146884.454:2430): avc: denied { name_bind } for pid=1268 comm="nginx" src=8888 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket 2 type=SYSCALL msg=audit(1452146884.454:2430): arch=c000003e syscall=49 success=no exit=-13 a0=b a1=1b5cc60 a2=10 a3=7ffdaf0be83c items=0 ppid=1 pid=1268 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)
這裏的詳細含義我也不清楚,但確定的是nginx無權限在8888端口上監聽。若是你確實但願nginx在8888端口上監聽,則可把8888端口號註冊爲受控端口。註冊前請先檢查一下8888端口是否已被登記:server
semanage port -l | grep 8888
若是有輸出則表示8888端口已被註冊,此時請換用其它端口。
要註冊http 8888端口號請執行:
semanage port -a -t http_port_t -p tcp 8888
做爲一種好習慣咱們應再次檢查一下受控端口列表,看看有沒有剛註冊的端口號:
semanage port -l | grep '^http_port_t'
最後再讓nginx從新加載配置:
# nginx -s reload
此時8888端口應處於監聽狀態:
# netstat -anp | grep 8888
若是你想讓你的應用被nginx反向代理,則被反向代理的端口號也必須爲已受控端口。
不知何故,只當你把nginx啓動爲服務時端口才受Linux安全性控制,若是你直接運行nginx則不受此控制。