Nginx
設置 Django + nginx + uwsgi + supervisord:/r un 與 /tmp 中的套接字之間的區別
我正在嘗試使用 uWSGI Emperor 和 nginx 在同一台機器上設置 2 個 Django Web 應用程序,並讓 supervisord 管理 Emperor 程序的啟動和重新啟動。在網際網路上進行大量搜尋後,我終於設法獲得了有效的部署。然而,在所有拉扯頭髮的過程中,我發現了一些奇怪的東西,如果有人能向我解釋為什麼會發生這種情況,我將不勝感激。
所以我以 root 身份在帝王模式下執行我的 uWSGI 程序。vassal ini 配置文件負責刪除我的 uid 的權限並創建一個由我的使用者擁有的套接字文件,組為 www-data(以便 nginx 可以寫入它)和權限 660。這是一個範例 vassal 配置:
[uwsgi] uid = xxxx chdir = %(project_dir)/%(project) home = %(venv_base)/%(venv) module = %(project).wsgi:application master = true processes = 4 socket = /tmp/%(project).sock chown-socket = %(uid):www-data chmod-socket = 660 stats = /tmp/%(project)_stat.sock logto = %(project_dir)/logs/uwsgi.log # Cleans up when the process is killed (includes deleting the socket file) vacuum = true
這工作得很好,但是如果我嘗試在 /run 而不是 /tmp 中創建套接字,我開始收到套接字 bind() 呼叫的權限被拒絕錯誤。使用適當的所有權和權限可以很好地創建套接字,但 vassal 無法在其上呼叫 bind() 或 unlink()。為什麼會這樣?/tmp 和 /run 有什麼區別,我應該什麼時候使用它們?任何幫助或指示將不勝感激。
編輯:我剛剛嘗試將套接字的權限設置為 777 並且 uwsgi 仍然給我一個權限被拒絕錯誤:(
我在 serverfault 上沒有足夠的聲譽來發表評論,所以我必須給出一個“答案”:
bind() 呼叫將套接字綁定到文件系統中的一個節點,因此您的使用者可能在 /run 中沒有寫權限!?在我的系統上 /tmp 有
og+w
,而 /run 有og-w
. 嘗試在具有寫入權限的 /run 子文件夾中創建套接字。“套接字創建得很好”是什麼意思?你能用另一個程序連接到它嗎?聽起來插座在那裡。但是根據我上面寫的內容,我不希望它出現在文件系統中。