前言
筆者在mac上裝VMWARE,再裝了minimal-ceotos6.10,網絡設置好後(宿主機和虛擬機互相能ping通且虛擬機能上網),在教程指導下裝nginx,在宿主機通過虛擬機的ip訪問,正常,但新增虛擬主機(指定到非原給定的目錄),訪問報403。經過層層試驗,最終發現是SELinux
默認開啓了導致。記錄下解決過程中的嘗試。
正文
1. 新建虛擬主機
- 域名爲
demo.com
, 訪問目錄爲/services/demo
1.1 服務端配置
# 創建自定義訪問目錄
mkdir -p /services/demo
vim /services/demo/index.html
# 輸入Hello Nginx,wq保存退出
# 複製原虛擬主機配置文件
cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/demo.conf
vim /etc/nginx/conf.d/demo.conf
# 修改
server_name demo.com; # 改
location / {
root /services/demo; # 改
index index.html index.htm;
}
# 保存退出後,重啓nginx或重新加載配置文件
service nginx restart # 重啓服務
nginx -s reload # 重新加載配置文件
# 查看虛擬機ip,看eth的inet addr,如此處是192.168.211.128
ifconfig
# 輸出
eth0 Link encap:Ethernet HWaddr 00:0C:29:9B:C2:CA
inet addr:192.168.211.128 Bcast:192.168.211.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe9b:c2ca/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:566 errors:0 dropped:0 overruns:0 frame:0
TX packets:312 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:65758 (64.2 KiB) TX bytes:62635 (61.1 KiB)
1.2 客戶端配置域名解析
- mac下的配置,windows同理,找到hosts文件即可。
vim /etc/hosts
# 添加域名解析 demo.com 192.168.211.128
# 這個ip是虛擬機的ip
1.3 訪問
- 瀏覽器直接輸入ip,訪問正常
- 輸入剛配置的demo.com,報403。開始排查原因
2 防火牆問題?
應該不是,剛做好的虛擬機,沒做任何特殊配置,直接輸入ip能正常訪問的,證明端口是通。其實沒想明白當前情況是否一定與防火牆無關,但不管了,先關再說。(後面證實我遇到的情況是與防火牆無關的)。
service iptables status
# 輸出一堆規則,有點難懂,先不管
service iptables stop
關了後再訪問,情況依舊。
-
後來想明白,一個排除是防火牆問題的方法,看nginx訪問日誌,錯誤日誌。按理來說,防火牆是先於nginx的,如果響應爲403的請求,在nginx錯誤日誌有記錄,那麼肯定與防火牆無關了。查看方法如下
tail -f /var/log/nginx/error.log # 我的輸出顯示是 /services/demo/index.html" is forbidden (13: Permission denied),......
這裏note一下:應該首先想起看錯誤日誌,錯誤提示之類的。再結合自己的猜測,防火牆?文件權限?虛擬主機配置錯誤? 因爲猜測可以有無限種,但錯誤日誌能快速過濾大部分。
3 虛擬主機配置問題或自定義目錄的權限?
-
nginx -t
測試過配置文件無語法錯誤,且我是複製原虛擬主機配置,只改了兩個小地方的。應該不是。 -
文件目錄權限,不管那麼多,直接777,先弄通再考慮最優設置。
chmod -R 777 /services
再次訪問,依然403。有點蒙了。
-
懷疑自己,可能是虛擬主機沒配好,可能是文件用戶與http請求訪問用戶的問題(當時對這塊知識比較模糊)。運用初中學的知識,控制變量法。目前我有一套能成功訪問例子(虛擬主機配置文件和具體訪問目),一套不成功的。做一下嘗試
- 好的虛擬主機配置,指向壞的目錄。fail
- 壞的虛擬主機,指向好的目錄。success。
很明顯,是自定義目錄問題。
-
但,已經最外層目錄到具體文件都設爲777了,按理是不存在文件無法讀,執行的問題的。因爲流程是這樣的,首先
vim /etc/nginx/nginx.conf` # 內容有 user nginx;
即意思是,客戶端發http請求到了服務端的nginx層, 是通過linux系統中的nginx用戶去讀寫執行對應文件的,(這個nginx用戶是安裝nginx是自動添加的)。可以將上面的user改爲root,但我認爲無必要,改爲777意味着非同組用戶都有讀寫執行權限,我自定義的目錄文件確實是root用戶擁有的,但改爲777,任何用戶都有rwx權限。
4 最終解決
實在沒思路了,上網搜nginx 403,一堆解決方案。我的是因爲SELinux
開啓了,導致無權限訪問。SELinux這東西是安全相關的,但貌似因爲學習難度大,很多運維都把它關了~,而虛擬機裝的centos6默認是開啓的…
# 查看selinux狀態
/usr/sbin/sestatus
vi /etc/selinux/config
# 註釋下面這個
# SELINUX=enforcing
# 添加這個
SELINUX=disabled
# 重啓
reboot
5 注意事項
- nginx修改配置後記得
nginx -s reload
重新加載配置文件,無需重新啓動,一般也不需要nginx -t
測試,因爲reload有問題,會報錯的。