Nginx、uWSGI、DjangoおよびPostgresqlスタックを使用してアプリを構築しています。アプリはNginxとuWSGIの間のUnixソケットを使用します。ソケットのファイル権限は775ですが、これはまだ取得しています権限エラー:
[error] 6978#0: *6725 connect() to unix:/path/to/socket failed (111: Connection refused) while connecting to upstream, client: 54.250.253.225, server: example.com, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:/path/to/socket:", Host: "example.com"
Nginxの構成
# uWSGI upstream
upstream app{
server unix:/path/to/socket;
}
# redirect www to non-www
server{
listen 80;
server_name www.example.com;
return 301 http://example.com$request_uri;
}
# configuration of the server
server {
# the port your site will be served on
listen 80;
# the domain name it will serve for
# substitute your machine's IP address or FQDN
server_name example.com
charset utf-8;
# root folder
root /path/to/root;
# max upload size
client_max_body_size 20M; # adjust to taste
access_log /path/to/access.log;
error_log /path/to/error.log;
# Django media
location /media {
# your Django project's media files - amend as required
alias /path/to/media;
}
location /static {
# your Django project's static files - amend as required
alias /path/to/static;
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass app;
# the uwsgi_params file you installed
include /path/to/uwsgi_params;
uwsgi_param Host $Host;
uwsgi_param X-Real-IP $remote_addr;
uwsgi_param UWSGI_SCHEME $scheme;
uwsgi_param SERVER_SOFTWARE nginx/nginx_version;
}
}
私の仮想環境のファイルはすべてubuntu:ubuntuに移行されています。 nginxユーザーはubuntuです。
uWSGIログ
*** Starting uWSGI 2.0.12 (64bit) on [Sun Apr 17 17:24:37 2016] ***
compiled with version: 4.8.4 on 17 April 2016 14:40:25
os: Linux-3.13.0-85-generic #129-Ubuntu SMP Thu Mar 17 20:50:15 UTC 2016
nodename: ip-10-167-29-5
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /path/to/app
detected binary path: /path/to/bin/uwsgi
chdir() to /path/to/chdir
your processes number limit is 30035
your memory page size is 4096 bytes
*** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers ***
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to UNIX address /path/to/socket fd 3
Python version: 3.4.3 (default, Oct 14 2015, 20:31:36) [GCC 4.8.4]
Set PythonHome to /path/to/home
Python main interpreter initialized at 0xa4df10
python threads support enabled
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 436608 bytes (426 KB) for 5 cores
*** Operational MODE: preforking ***
/path/to/lib/python3.4/site-packages/cloudinary/models.py:24: RemovedInDjango110Warning: SubfieldBase has been deprecated. Use Field.from_db_value instead.
return meta(name, bases, d)
WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0xa4df10 pid: 8567 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 8567)
spawned uWSGI worker 1 (pid: 8569, cores: 1)
spawned uWSGI worker 2 (pid: 8570, cores: 1)
spawned uWSGI worker 3 (pid: 8571, cores: 1)
spawned uWSGI worker 4 (pid: 8572, cores: 1)
spawned uWSGI worker 5 (pid: 8573, cores: 1)
誰かがこの権限の問題の原因を教えてくれますか?
私は自分で問題を解決することができました。サーバーを再起動しました。それから私はNginxとuWSGIを再起動して
Sudo service nginx restart
Sudo service uwsgi restart
Nginxは問題なく再起動しました。ただし、uWSGIは次のエラーを返しました。
/etc/init.d/uwsgi: line 73: /usr/share/uwsgi/init/do_command: No such file or directory
ディレクトリに切り替えてみました。しかし、それは存在しませんでした。だから、私はuwsgiディレクトリにinitディレクトリを作成しました:
Sudo mkdir init
それから私は新しいディレクトリに入りました:
cd init
そのディレクトリで、uWSGIが見つけられなかったファイルdo_commandを作成しました。
Sudo nano do_command
ファイルエディターを開いて、見つけた次のファイルを貼り付けました: https://raw.githubusercontent.com/jbq/uwsgi/master/debian/uwsgi-files/init/do_command :
# This is Shell script, sourced by uWSGI init.d script
. /usr/share/uwsgi/init/snippets
. /usr/share/uwsgi/init/specific_daemon
do_command()
{
local COMMAND="$1"
shift
local ERRORS=0
# If command is given with arguments, i.e. 'start smth smth_else'
if [ -n "$1" ]; then
[ "x$VERBOSE" != "xno" ] && log_progress_msg "->"
# Iterate over given configuration file specifications and:
# * either print notice that conforming conffile wasn't found (if it
# wasn't)
# * or execute given command with conforming conffile
local CONFSPEC_PATH=""
for CONFSPEC in "$@"; do
CONFSPEC_RELPATH="$(relative_path_to_conffile_with_spec "$CONFSPEC")"
if [ -z "${CONFSPEC_RELPATH}" ]; then
log_progress_not_found "$CONFSPEC"
else
do_with_given_specific_daemon "$COMMAND" "$CONFSPEC_RELPATH"
ERRORS="$(expr "$ERRORS" + "$?")"
fi
done
[ "$ERRORS" -eq 0 ] && log_progress_done
return "$ERRORS"
fi
# Do not start daemon if it was disabled.
if [ "x$COMMAND" = "xstart" -a "x$RUN_AT_STARTUP" != "xyes" ]; then
[ "x$VERBOSE" != "xno" ] && log_progress_msg "(disabled; see /etc/default/${NAME})"
return 2
fi
local SOME_CONF_WAS_FOUND=no
local UWSGI_APPS_CONFDIRS="$(ls -1d ${UWSGI_APPS_CONFDIR_GLOB})"
# This construction is needed for supporting configuration file names with
# spaces or control characters.
#
# See http://www.dwheeler.com/essays/filenames-in-Shell.html (paragraph #4).
#
# Predefined delimeters are resetted to null character (by changing IFS and
# setting -d option of 'read' command) and then:
# * 'find -print0' command is used for finding all available confnames
# * 'while ... read' loop is used for iterating over found confnames
#
# Also process substitution is used, so that variables changed inside 'while'
# loop will retain their values after exiting from loop.
#
# By default 'find' command use emacs-style regexps. Emacs-style regexp
# processor with given regexp doesn't matches to file names with newline
# character. Posix-style regexp processor is working good.
#
# With executing 'sed' over found paths, relative configuration file
# paths are extracted from full paths provided with 'find' output.
# Firstly, common directory path (UWSGI_CONFDIR) is stripped from 'find'
# output. Secondly, all directories (except the first) and file extensions
# are stripped from result of first substitution.
#
# For example: list of found paths
# '/etc/uwsgi/apps-enabled/site.ini\0/etc/uwsgi/apps-enabled/dir/site2.ini'
# is transformed by sed into 'apps-enabled/site\0apps-enabled/site2'.
while IFS="" read -r -d "" RELATIVE_CONFPATH <&4 ; do
if [ "x$SOME_CONF_WAS_FOUND" = "xno" -a "x$VERBOSE" != "xno" ]; then
log_progress_msg "->"
fi
SOME_CONF_WAS_FOUND=yes
do_with_given_specific_daemon "$COMMAND" "$RELATIVE_CONFPATH"
ERRORS="$(expr "$ERRORS" + "$?")"
done 4< <(find "$UWSGI_APPS_CONFDIRS" \
-regextype posix-basic \
-iregex ".*\.${UWSGI_CONFFILE_TYPES_REGEXP}\$" -a -xtype f \
-print0 \
| sed -e "s:\(^\|\x0\)${UWSGI_CONFDIR}/:\1:g" \
-e "s:\([^\x0/]\+\)\([^\x0]\+\)\?/\([^/\x0]\+\)\.${UWSGI_CONFFILE_TYPES_REGEXP}\x0:\1/\3\x0:g" \
| sort --zero-terminated --unique \
)
if [ "x$VERBOSE" != "xno" ]; then
if [ "x$SOME_CONF_WAS_FOUND" = "xno" ]; then
log_progress_msg "(omitted; missing conffile(s) in ${UWSGI_APPS_CONFDIR_GLOB})"
Elif [ "$ERRORS" -eq 0 ]; then
log_progress_done
fi
fi
return "$ERRORS"
}
do_with_given_specific_daemon()
{
local COMMAND="$1"
shift
local RELATIVE_CONFPATH="$@"
local ERRORS=0
case "$COMMAND" in
start) do_start_specific_daemon "$RELATIVE_CONFPATH" ;;
stop) do_stop_specific_daemon "$RELATIVE_CONFPATH" ;;
force-reload) do_force_reload_specific_daemon "$RELATIVE_CONFPATH" ;;
reload|*) do_reload_specific_daemon "$RELATIVE_CONFPATH" ;;
esac
case "$?" in
0) log_progress_ok "$RELATIVE_CONFPATH" ;;
1) log_progress_skip "$RELATIVE_CONFPATH" ;;
*) log_progress_error "$RELATIVE_CONFPATH"
ERRORS=1
;;
esac
return "$ERRORS"
}
# Print progress notification about successful command execution.
log_progress_ok()
{
local RELATIVE_CONFPATH="$@"
local CONFNAME=""
[ "x$VERBOSE" = "xno" ] && return
if [ "x$PRINT_CONFNAMES_IN_INITD_SCRIPT_OUTPUT" != "xno" ]; then
CONFNAME="$(make_confname_for_progress_log "$RELATIVE_CONFPATH")"
log_progress_msg "$CONFNAME"
else
log_progress_msg '.'
fi
}
# Print progress notification about skipped command execution.
#
# It is printed, for example, when 'start' command was issued, but specific
# daemon is already started. Or when 'stop' command was issued, but specific
# daemon isn't runned yet.
log_progress_skip()
{
local RELATIVE_CONFPATH="$@"
local CONFNAME=""
[ "x$VERBOSE" = "xno" ] && return
if [ "x$PRINT_CONFNAMES_IN_INITD_SCRIPT_OUTPUT" != "xno" ]; then
CONFNAME="$(make_confname_for_progress_log "$RELATIVE_CONFPATH")"
log_progress_msg "(${CONFNAME})"
else
log_progress_msg "."
fi
}
# Print progress notification about missing configuration file with given
# name.
log_progress_not_found()
{
local RELATIVE_CONFPATH="$@"
local CONFNAME=""
[ "x$VERBOSE" = "xno" ] && return
if [ "x$PRINT_CONFNAMES_IN_INITD_SCRIPT_OUTPUT" != "xno" ]; then
CONFNAME="$(make_confname_for_progress_log "$RELATIVE_CONFPATH")"
fi
log_progress_msg "${CONFNAME}?"
}
# Print progress notification about failed command execution.
log_progress_error()
{
local RELATIVE_CONFPATH="$@"
local CONFNAME=""
[ "x$VERBOSE" = "xno" ] && return
if [ "x$PRINT_CONFNAMES_IN_INITD_SCRIPT_OUTPUT" != "xno" ]; then
CONFNAME="$(make_confname_for_progress_log "$RELATIVE_CONFPATH")"
fi
log_progress_msg "${CONFNAME}!"
}
log_progress_done()
{
log_progress_msg "done"
}
make_confname_for_progress_log()
{
local RELATIVE_CONFPATH="$@"
local CONFNAMESPACE="$(extract_confnamespace "$RELATIVE_CONFPATH")"
local CONFNAME="$(extract_confname "$RELATIVE_CONFPATH")"
echo "$(sanitize_confname "${CONFNAMESPACE}/${CONFNAME}")"
}
# Sanitize configuration file name for printing it in terminal.
sanitize_confname()
{
local CONFNAME="$@"
# In sanitizing:
# * all control ASCII characters are replaced with '?' character
# * confname with spaces is surrounded by single quotes.
CONFNAME="$(echo -n "$CONFNAME" | tr '[\001-\037\177]' '?')"
case "$CONFNAME" in
*[[:space:]]*) echo "'$CONFNAME'" ;;
*) echo "$CONFNAME" ;;
esac
}
次に、uWSGIを再起動しました。
Sudo service uwsgi restart
Djangoアプリは正常に起動しました。
基本的に、私はDjangoプロジェクトです。ルートパスワードをリセットした後、仮想環境を再度アクティブにし、NginxとGunicornを再起動しました。これにより、エラーが解決しました。
Nginxの再起動:Sudo service nginx restart
Gunicornの再起動:gunicorn --reload <your-wsgi-folder-name>.wsgi bind 0.0.0.0:8000
(chdir()
呼び出しにより)uWSGIサービスが異なる絶対パスを使用してUnixソケットでリッスンしているようです。 lsof | grep "/path/to/socket"
を使用して、リッスンされているUnixソケットの絶対パスを見つけることができます。 /path/to/chdir/path/to/socket
でしょうか。
まず第一に、設定を読みやすくし、上流のものを忘れるようにします。私はuWSGIで長時間働いています。私は頻繁にソケット関連の問題(特にpythonプロジェクト)に問題がありましたが、PHPとuWSGIの場合、ソケットを使用すると驚くほどうまくいきます。
あなたが本当にuWSGIを利用することに固執するなら、2つのものが必要です!
最初に、プロジェクトに関連するすべてのuWSGIパラメータが格納されているconfig.iniとnginx構成。
2番目のnginx.confでは、要求はuWSGIにルーティングされ、さらに処理されます。
/ etc/hosts:
127.0.0.1 projekte.local
nginx.conf:
server {
listen 127.0.0.1:80;
server_name projekte.local;
include uwsgi_params;
location / {
uwsgi_pass 127.0.0.1:3030;
}
projekte.conf(私たちのiniファイル):
[uwsgi]
socket = 127.0.0.1:3030
uid = daemon
gid = daemon
venv = /storage/PyENV/projekteENV
project_dir = /storage/PyProjects/bprojekte/projekte
chdir = %(project_dir)
master = true
plugins = plugins/python/python
check-static = %(project_dir)
static-skip-ext = .py
static-skip-ext = .pyc
static-skip-ext = .inc
static-skip-ext = .tpl
pidfile2 = /var/run/uwsgi/projekte.pid
disable-logging = false
processes = 8
cheaper = 2
#daemonize2 = true
enable-threads = true
offload-threads = N
py-autoreload = 1
wsgi-file = /storage/PyProjects/bprojekte/projekte/wsgi.py
uWSGIアプリケーションフォルダーに移動し、次のコマンドでuWSGIを起動します。
./uwsgi --ini /path/to/projekte.conf
nginxを起動します。
/usr/local/nginx/sbin/nginx
そしてURLを開きます(この場合: http://projekte.local )
質問:なぜuWSGIを使い続けるのですか? gunicornはスタンドアロンマシン用であり、使用するのがはるかに簡単です。 gunicornからuWSGIへの切り替えは1分で完了します(コードの1行を変更する必要はありません)。
uWSGIはスケーリング用...スタンドアロン用...うーん、わかりません。
ベスト、テイマー