下列的本教程,我能够设置 Django、Gunicorn 和 nginx在虚拟环境中在 AWS EC2 实例(运行 Ubuntu 16.04)上,然后继续创建 Upstart 文件来“守护”整个过程。
激活虚拟环境后,我检查了:
- Django 的工作- 通过运行以下命令,我可以通过端口 8000 访问我的 Django 项目:
./manage.py runserver 0.0.0.0:8000
当我访问时,mydomain.com:8000
我受到了默认的 Django 页面的欢迎。
- Gunicorn 可以运行,并且能够为 Django 应用提供服务- 我可以通过从我的项目文件夹运行以下命令来访问我的 Django 应用程序(替换
projectname
为我的实际项目名称):
gunicorn --bind 0.0.0.0:8000 projectname.wsgi:application
这次访问时,mydomain.com:8000
我再次看到了欢迎页面,在/admin
URL 末尾附加内容后,我可以看到登录屏幕减CSS(因为 Gunicorn 不知道静态 CSS 文件,根据教程,目前这是可以的)。
从这里我开始创建以下 systemd 文件(当masterfolder
用于显示发生所有操作的文件夹时,myuser
是我的系统用户(ubuntu
,因为这是一个 Ubuntu 实例):
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=myuser
Group=www-data
WorkingDirectory=/home/myuser/masterfolder
ExecStart=/home/myuser/masterfolder/myvirtualenv/bin/gunicorn --workers 3 --bind unix:/home/myuser/masterfolder/projectname.sock$
[Install]
WantedBy=multi-user.target`
我遇到了两个问题:
- 未创建套接字- 检查 nginx 日志文件时内外virtualenv(顺便说一下,不完全确定为什么它们相同)我看到了同样的错误:
2017/01/17 15:12:43 [crit] 12403#12403: *3 connect() to unix:/home/myuser/masterfolder/projectname.sock failed (2: No such file or directory) while connecting to upstream
现在,请注意与我运行时创建的masterfolder
文件夹层次结构一致:django-admin
startproject
masterfolder/ ├── manage.py └── projectname ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py
向内看masterfolder
确实根本没有 .sock 文件,不要介意名为 的人projectname.sock
。
- 因此,尽管 nginx 可以正常工作,但它会抛出 502-
我的etc/nginx/sites-availabe/projectname
文件如下所示:
server {
listen 80;
server_name www.mydomain.com mydomain.com MYIPADDRESS;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/masterfolder/projectname;
}
location / {
include proxy_params;
proxy_pass http://unix:/home/myuser/mastefolder/projectname.sock;
}
}
当然,它的符号链接是正确的,并且在每次我尝试修复它之后我都会运行:
sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl restart nginx
我感觉我似乎错过了一些基本知识,没有理解所有这些基础设施是如何协同工作的。当然,欢迎指出我对这个过程的理解有误。
答案1
您是否检查过masterfolder
目录的权限?
权限应该是myuser:www-data
。
另外,您的 nginx 配置文件中有一个拼写错误。希望那是一个打字错误:)