2011-07-22 111 views
152

我在CentOS 5盒子上安裝了帶有PHP-FPM的nginx,但我努力讓它爲我的任何文件提供服務 - 無論PHP與否。Nginx 403禁止所有文件

Nginx正在以www-data:www-data的形式運行,並且默認的「歡迎使用EPEL上的nginx」網站(由擁有644權限的root擁有)加載正常。

nginx的配置文件具有用於 /etc/nginx/sites-enabled/*.conf,一個包括指令和我有一個配置文件example.com.conf,從而:

server { 
listen 80; 

Virtual Host Name 
server_name www.example.com example.com; 


location/{ 
    root /home/demo/sites/example.com/public_html; 
    index index.php index.htm index.html; 
} 

location ~ \.php$ { 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_index index.php; 
    fastcgi_param PATH_INFO $fastcgi_script_name; 
    fastcgi_param SCRIPT_FILENAME /home/demo/sites/example.com/public_html$fastcgi_script_name; 
    include  fastcgi_params; 
} 
} 

儘管通過的public_html WWW的數據所擁有:WWW的數據與2777年文件的權限,本網站不提供任何內容 -

[error] 4167#0: *4 open() "/home/demo/sites/example.com/public_html/index.html" failed (13: Permission denied), client: XX.XXX.XXX.XX, server: www.example.com, request: "GET /index.html HTTP/1.1", host: "www.example.com" 

我發現了許多其他職位與用戶越來越403S˚F rom nginx,但是我所見過的大多數涉及Ruby/Passenger(過去我已經成功實現)的更復雜的設置,或者只有在涉及上游PHP-FPM時纔會收到錯誤,所以它們似乎是一點幫助。

我在這裏做過些傻事嗎?

回答

280

一個經常被忽略的權限需求是用戶需要在文件的每個父目錄中訪問該文件的權限。檢查/,/ home,/ home/demo等的www-data x訪問權限。我的猜測是/ home可能是770,而www-data無法通過它到達任何subdir。如果是,請嘗試chmod o + x/home(或任何目錄拒絕請求)。

編輯:爲了方便地顯示在路徑上的所有權限,可以使用namei -om /path/to/check

+4

同樣在這裏。在安裝CentOS 6時,默認情況下/ home/user dirs設置爲700。 – jjt

+1

這個傢伙也在談論它:('chmod -4 + x/mypath'爲我工作)http://nginxlibrary.com/403-forbidden-error/ –

+0

有人可以解釋爲什麼這個行爲是不同於apache不行要求每個父目錄具有「x」權限?!? – JoshuaDavid

18

我試過不同的情況下,只有當業主被設置爲nginx的(chown -R nginx:nginx "/var/www/myfolder") - 它開始按預期運行。

+1

也爲我工作。我懷疑會發生這種情況,因爲即使nginx以root身份啓動,它也會在nginx.conf文件中指定的用戶下生成進程,該文件是「user nginx;」默認。將用戶更改爲擁有文檔根目錄的用戶也應按照Anderson的建議工作。 – kvdv

+0

安德森先生?沒有! Andron;) – Andron

+0

道歉先生安德龍;)我似乎無法編輯以前的評論了,雖然... – kvdv

221

如果您在驗證父文件夾的權限後仍看到permission denied,則可能是SELinux限制訪問。

要檢查SELinux的運行:

# getenforce 

要禁用SELinux,直到下一次重新啓動:

# setenforce Permissive 

重啓Nginx的,看看問題是否仍然存在。爲了讓nginx的服務於您的www目錄(請確保您測試這之前打開了SELinux回。即,setenforce Enforcing

# chcon -Rt httpd_sys_content_t /path/to/www 

見我answer here更多細節

+1

我無法弄清楚爲什麼每當我開始nginx它說'open()「/usr/share/nginx/logs/xxxxxx.com-error_log」失敗(13:權限被拒絕)''後我檢查權限和確保它以root身份啓動。我遇到了這個,發現SELinux已啓用。我禁用它,現在它沒有問題。謝謝! – ub3rst4r

+1

謝謝!我仍然有一個權限拒絕擁有自己的FPM套接字的用戶的問題,所以我可以通過在/ var/nginx/nginx中將'user'從** nginx **更改爲** root **來解決這個問題。 conf'--也許這會幫助遇到這個問題的其他人。 S/O轉換爲[DataPsyche](http://datapsyche.wordpress.com/2014/07/30/nginx-404-page-not-found-error-due-to-failed-13-permission-denied/)for第二部分。 – Winter

+0

我覺得centos 6.6有一個bug。 Selinux打破了nginx。 –

0

我挖自己變成了一個輕微的變異對這個錯誤地運行setfacl命令的問題。我跑:

sudo setfacl -m user:nginx:r /home/foo/bar 

我贊成增加nginxfoo組放棄了這條路線,但自定義ACL被挫敗的nginx的嘗​​試訪問該文件。我通過運行清除它:

sudo setfacl -b /home/foo/bar 

然後nginx能夠訪問這些文件。

41

我通過添加用戶設置解決了這個問題。

與Linux用戶名nginx.conf

worker_processes 4; 
user username 

變化的 '用戶名'。

+2

我相信這個答案比接受的答案更安全明智。您不必亂搞主文件夾(可能包含敏感信息)的權限,並且如果您使用nginx進行開發,則無需將奇怪的文件權限上傳到SCM。 – CamelBlues

+0

在主目錄上添加的權限是執行,而不是讀取,因此沒有顯示敏感信息(理論上)(除非在這種情況下,可能是惡意的PHP腳本向上遞增並且知道敏感文件在另一個腳本中的位置目錄可訪問www數據)。 您還會注意到,在原始問題中,我的nginx以「www-data」運行 - 此處的配置值已按需要設置。 –

+2

還必須添加用戶組:用戶使用組。 –

16

我有這個錯誤,我終於用下面的命令解決了它。

restorecon -r /var/www/html 

這個問題是由於你將某件事從一個地方轉移到另一個地方造成的。它在移動時會保留原始的selinux上下文,因此如果您在/ home或/ tmp中解壓某些內容,則會獲得與其位置相匹配的selinux上下文。現在你把它變成/ var/www/html,並且它使用上下文表示它屬於/ tmp或/ home,並且httpd不被策略允許訪問這些文件。

如果您使用cp文件而不是mv文件,selinux上下文會根據您要複製的位置而不是它來自哪裏。運行restorecon會將上下文恢復爲默認值並修復它。

+1

謝謝@jsina,這幫了我很多 –

1

老問題,但我有同樣的問題。我試過上面的每個答案,沒有任何工作。儘管我已經修復了這個問題,但刪除了該域名,然後重新添加了該域名。我使用Plesk,並且在域已經存在之後我安裝了Nginx。

雖然先進行了/ var/www/backups的本地備份。所以我可以輕鬆地複製文件。

奇怪的問題....

0

我們有同樣的問題,使用的Plesk瑪瑙17,而不是與權利等搞亂了,解決辦法是nginx的用戶加入到psacln組,在所有其他領域業主(用戶)分別爲:

usermod -aG psacln nginx 

現在nginx的有權限訪問的.htaccess或任何其他必要文件,以正確顯示的內容。

在另一方面,也確保Apache是​​在psaserv組,提供靜態內容:

usermod -aG psaserv apache 

而且不要忘了重新啓動Apache和Nginx的Plesk中後! (並用Ctrl-F5重新加載頁面)