【问题标题】:Setting 2 sites in a Nginx server with gunicorn + django using systemD service使用 systemD 服务在带有 gunicorn + django 的 Nginx 服务器中设置 2 个站点
【发布时间】:2017-01-19 08:43:20
【问题描述】:

我正在学习教程: http://www.obeythetestinggoat.com/book/chapter_09.html

所以,我在 DigitalOcean 中有两个站点,分别是 nginxgunicorn,一个用于舞台,一个用于普通... stage.nossalista.tknossalista.tk,首先我设法成功部署并运行第一阶段,但是在上传正常并为我的正常服务添加另一个 systemd 服务后,一切都停止工作了.. 我要把所有我的配置,希望你们给我一些提示可能是问题....

我从 nossalista.tk 收到错误 400,我的 stage.nossalista.tk 收到错误 502

[更新]:我只能在 stage.nossalista.tk:9000 中访问该网站 .... 希望这对那些想帮助我的人有所帮助

首先我做的是配置

/etc/nginx/sites-available/stage.nossalista.tk:

server {
    listen 80;
    server_name nossalista.tk;

    location /static {
        alias /home/tyago/sites/nossalista.tk/static;
    }

    location / {
        proxy_set_header Host $host;
        proxy_pass http://unix:/tmp/nossalista.tk.socket;
    }
}

其次我在

中为这个阶段站点配置服务

/etc/systemd/system/gunicorn.service:

[Unit]
Description=Gunicorn server for stage.nossalista.tk
After=network.target

[Service]
User=tyago
Group=www-data
WorkingDirectory=/home/tyago/sites/stage.nossalista.tk/source
ExecStart=/home/tyago/sites/stage.nossalista.tk/virtualenv/bin/gunicorn --workers 3 --bind unix:/tmp/stage.nossalista.tk.socket superlists.wsgi:application
Restart=always

[Install]
WantedBy=multi-user.target

然后在

中配置我的socket服务

/etc/systemd/system/gunicorn.socket:

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn/socket
ListenStream=0.0.0.0:9000
ListenStream=[::]:8000

[Install]
WantedBy=sockets.target

然后是 gunicorn.conf 文件 (tyago 是我的用户)

/usr/lib/tmpfiles.d/gunicorn.conf

d /run/gunicorn 0755 tyago tyago  -

在我启用两者之后:

systemctl enable gunicorn.service
systemctl enable gunicorn.socket
systemctl start gunicorn.service
systemctl start gunicorn.socket

重新启动服务器后,我能够访问 stage.nossalista.tk。伟大的! 但问题是当把正常的网站上 我在 systemd 中创建了另一个服务,这次叫做

gunicorn-nossalista.tk.service:

[Unit]
Description=Gunicorn server for www.nossalista.tk
After=network.target

[Service]
User=tyago
Group=www-data
WorkingDirectory=/home/tyago/sites/nossalista.tk/source
ExecStart=/home/tyago/sites/nossalista.tk/virtualenv/bin/gunicorn --workers 3 --bind unix:/tmp/nossalista.tk.socket superlists.wsgi:application
Restart=always

[Install]
WantedBy=multi-user.target

并在

中配置

/etc/nginx/sites-available/nossalista.tk 为:

[Unit]
Description=Gunicorn server for www.nossalista.tk
After=network.target

[Service]
User=tyago
Group=www-data
WorkingDirectory=/home/tyago/sites/nossalista.tk/source
ExecStart=/home/tyago/sites/nossalista.tk/virtualenv/bin/gunicorn --workers 3 --bind unix:/tmp/nossalista.tk.socket superlists.wsgi:application
Restart=always

[Install]
WantedBy=multi-user.target

我的 gunicorn.service 、 gunicorn.socket 和 gunicorn-nossalista.tk.serice 的 systemctl 状态都是 Active

检查我的 nginx 错误日志,我发现只有我的阶段文件在那里记录以下错误:

Nginx 错误日志

2016/09/11 21:16:17 [crit] 3173#3173: *39 connect() to unix:/tmp/stage.nossalista.tk.socket failed (2: No such file or directory) while connecting to upstream, client: 189.34.5.XXX, server: stage.nossalista.tk, request: "GET / HTTP/1.1", upstream: "http://unix:/tmp/stage.nossalista.tk.socket:/", host: "stage.nossalista.tk"

好的,我更改了套接字以与正常站点一起使用,所以我的错误可能是我没有用于 stage.nossalista 的套接字...但是 为什么我没有从我的正常站点看到任何日志错误消息 如果我配置正确 /etc/nginx/sites-enabled/nossalista.tk 在 error.log 中?在访问日志中,当我通过普通站点(nossalista.tk)访问时,我得到了这个

访问 Nginx 日志:

189.34.5.XXX - - [11/Sep/2016:21:53:30 +0000] "GET / HTTP/1.1" 400 37 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:48.0) Gecko/20100101 Firefox/48.0"

我知道那里有些东西真的很奇怪,但是如果我在 sites-enabled/nossalista.tk 中有它,我找不到为什么我得到错误 400 所有配置都正确指向正确的套接字等等......

如果你们帮助我,我会非常满意,我会帮助任何有类似错误的人......我只需要一些帮助来让它工作!

我的 sudo nginx -t:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

我真的不知道要检查什么……如果你们有一些提示,那就太好了!

我认为我的问题出在插座上……可能我需要 2 个插座,但不知道该怎么做!

对于这个大问题,我很抱歉......

【问题讨论】:

  • 你的问题是为什么看不到错误日志?
  • 将您的/etc/systemd/system/gunicorn.socket 文件复制到stage.nossalista.tk.socketnossalista.tk.socket 并将它们放在某个地方。然后更改端口号。然后配置您的服务以使用这些套接字。然后将 nginx 配置为 proxy_pass 到这些套接字
  • 欢迎您的评论,我现在就开始您的解决方案!
  • 所以,我按照你说的做了……现在我有 2 个服务(stage 和 normal)和 2 个套接字,但现在我只能通过 nossalista.tk:8000 和 stage.nossalista 访问。 tk:8001,完美,但我如何消除指定端口的需要?感谢您的帮助 !我觉得这是在 nginx 配置中

标签: django ubuntu nginx


【解决方案1】:

不清楚您的 nginx.conf 中是否定义了两台服务器(即 stage.nossalista.tk 和 nossalista.tk),但从您后来的评论来看,您似乎有。

因此,如果您的两个 gunicorn 服务都在创建套接字,那么在您的 nginx.conf 中只需将每个服务指定为上游应用服务器:

upstream staging_server {
  server unix:<staging-socket-name> fail_timeout=0;
}

upstream production_server {
  server unix:<production-socket-name> fail_timeout=0;
}

server {
  listen 80;
  server_name stage.nossalista.tk;
  <...>
    proxy_pass http://staging_server; 
  <...>
}

server {
  listen 80;
  server_name nossalista.tk;
  <...> 
    proxy_pass http://production_server; 
  <...>
}

虽然我会说大多数登台和生产环境都在不同的服务器(Droplet)上。这样,配置在各个实例中保持不变。在您的情况下,您需要确保您的阶段和生产实例具有不同的数据库名称。

【讨论】:

  • 所以,感谢您的评论!我所做的是:将我的服务器降级到 ubuntu 14.04,然后使用 Upstart 并使用两个域......并且每件事都像教程中的一样工作但是谢谢你的回答,我明白了你所说的,这对我作为初学者很有帮助!谢谢!
猜你喜欢
  • 2020-09-27
  • 1970-01-01
  • 2017-03-13
  • 2011-09-24
  • 2020-09-22
  • 2017-07-17
  • 2018-03-27
  • 1970-01-01
  • 2019-09-19
相关资源
最近更新 更多