Nginx

設置 Django + nginx + uwsgi + supervisord:/r un 與 /tmp 中的套接字之間的區別

  • December 7, 2016

我正在嘗試使用 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 子文件夾中創建套接字。

“套接字創建得很好”是什麼意思?你能用另一個程序連接到它嗎?聽起來插座在那裡。但是根據我上面寫的內容,我不希望它出現在文件系統中。

引用自:https://serverfault.com/questions/819284