虛擬機centos6下nginx自定義目錄訪問報403的解決記錄

前言

筆者在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 訪問

  1. 瀏覽器直接輸入ip,訪問正常
  2. 輸入剛配置的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 虛擬主機配置問題或自定義目錄的權限?

  1. nginx -t測試過配置文件無語法錯誤,且我是複製原虛擬主機配置,只改了兩個小地方的。應該不是。

  2. 文件目錄權限,不管那麼多,直接777,先弄通再考慮最優設置。

    chmod -R 777 /services
    

    再次訪問,依然403。有點蒙了。

  3. 懷疑自己,可能是虛擬主機沒配好,可能是文件用戶與http請求訪問用戶的問題(當時對這塊知識比較模糊)。運用初中學的知識,控制變量法。目前我有一套能成功訪問例子(虛擬主機配置文件和具體訪問目),一套不成功的。做一下嘗試

    1. 好的虛擬主機配置,指向壞的目錄。fail
    2. 壞的虛擬主機,指向好的目錄。success。

    很明顯,是自定義目錄問題。

  4. 但,已經最外層目錄到具體文件都設爲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有問題,會報錯的。

參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章