首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nginx添加新站点会导致ERR_TOO_MANY_REDIRECTS

nginx添加新站点会导致ERR_TOO_MANY_REDIRECTS
EN

Stack Overflow用户
提问于 2019-03-26 13:04:12
回答 1查看 91关注 0票数 1

我正在尝试将另一个Django应用程序添加到我的服务器上。我已经启动并运行了xmlanalyzer.maciejg.pl,现在我正在尝试添加到现有的nginx & gunicorn安装程序中,以便在fencing.maciejg.pl上使用。

我使用了现有的XMLAnalyzer gunicorn设置(工作正常):

代码语言:javascript
复制
#!/bin/bash

NAME="xmlanalyzer"                                   # Name of the application
DJANGODIR=/home/django/xmlanalyzer                   # Django project directory
SOCKFILE=/home/django/xmlanalyzer/run/gunicorn.sock  # we will communicte using this unix socket
USER=my-user-name                                             # the user to run as
GROUP=my-user-name                                            # the group to run as
NUM_WORKERS=3                                        # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=xmlanalyzer.settings          # which settings file should Django use
DJANGO_WSGI_MODULE=xmlanalyzer.wsgi                  # WSGI module name

echo "Starting $NAME as `whoami`"

# Activate the virtual environment
cd $DJANGODIR
source ../venv/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
#exec gunicorn -b 127.0.0.1:8001 xmlanalyzer.wsgi:application --pid /tmp/gunicorn.pid ;
exec gunicorn -b 127.0.0.1:8001 ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
##   --bind=unix:$SOCKFILE \
  --bind=127.0.0.1:8001 \
  --log-level=debug \
  --log-file=-

这里是击剑应用程序的gunicorn设置(不起作用):

代码语言:javascript
复制
#!/bin/bash

NAME="fencing"                                  # Name of the application
DJANGODIR=/home/django/fencing                  # Django project directory
SOCKFILE=/home/django/fencing/run/gunicorn.sock # we will communicte using this unix socket
USER=my-user-name                                        # the user to run as
GROUP=my-user-name                                       # the group to run as
NUM_WORKERS=3                                   # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=mysite.settings          # which settings file should Django use
DJANGO_WSGI_MODULE=mysite.wsgi                  # WSGI module name

echo "Starting $NAME as `whoami`"

# Activate the virtual environment
cd $DJANGODIR
source ../venv/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR

# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)

exec gunicorn -b 127.0.0.1:8002 ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
##   --bind=unix:$SOCKFILE \
  --bind=127.0.0.1:8002 \
  --log-level=debug \
  --log-file=-

两人似乎都站起来了:

代码语言:javascript
复制
ps -ef | grep gunicorn
my-user-name        780 20697  0 10:20 ?        00:00:01 /home/django/venv/bin/python3 /home/django/venv/bin/gunicorn -b 127.0.0.1:8002 mysite.wsgi:application --name fencing --workers 3 --user=my-user-name --group=my-user-name
my-user-name        787   780  0 10:20 ?        00:00:00 /home/django/venv/bin/python3 /home/django/venv/bin/gunicorn -b 127.0.0.1:8002 mysite.wsgi:application --name fencing --workers 3 --user=my-user-name --group=my-user-name
my-user-name        788   780  0 10:20 ?        00:00:00 /home/django/venv/bin/python3 /home/django/venv/bin/gunicorn -b 127.0.0.1:8002 mysite.wsgi:application --name fencing --workers 3 --user=my-user-name --group=my-user-name
my-user-name        789   780  0 10:20 ?        00:00:00 /home/django/venv/bin/python3 /home/django/venv/bin/gunicorn -b 127.0.0.1:8002 mysite.wsgi:application --name fencing --workers 3 --user=my-user-name --group=my-user-name
my-user-name       1712  1656  0 12:40 pts/1    00:00:00 grep --color=auto gunicorn
root      1730     1  0  2018 ?        01:04:09 /home/django/venv/bin/python3 /home/django/venv/bin/gunicorn -b 127.0.0.1:8001 xmlanalyzer.wsgi:application --name xmlanalyzer --workers 3 --user=my-user-name --group=my-user-name
my-user-name      17483  1730  0 Mar25 ?        00:01:12 /home/django/venv/bin/python3 /home/django/venv/bin/gunicorn -b 127.0.0.1:8001 xmlanalyzer.wsgi:application --name xmlanalyzer --workers 3 --user=my-user-name --group=my-user-name
my-user-name      17554  1730  0 Mar25 ?        00:01:05 /home/django/venv/bin/python3 /home/django/venv/bin/gunicorn -b 127.0.0.1:8001 xmlanalyzer.wsgi:application --name xmlanalyzer --workers 3 --user=my-user-name --group=my-user-name
my-user-name      17953  1730  0 Mar25 ?        00:00:41 /home/django/venv/bin/python3 /home/django/venv/bin/gunicorn -b 127.0.0.1:8001 xmlanalyzer.wsgi:application --name xmlanalyzer --workers 3 --user=my-user-name --group=my-user-name

我使用以下方法创建了nginx安装程序:

代码语言:javascript
复制
/etc/nginx/sites-available# more xmlanalyzer
server {
    server_name xmlanalyzer.maciejg.pl;

    access_log off;

    location /static/ {
        alias /home/django/xmlanalyzer/XMLAnalyzer/static/;
    }

    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8001;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
    }
 # managed by Certbot

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/xmlanalyzer.maciejg.pl/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/xmlanalyzer.maciejg.pl/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}

server {
    if ($host = xmlanalyzer.maciejg.pl) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    server_name xmlanalyzer.maciejg.pl;
    listen 80;
    return 404; # managed by Certbot
    client_max_body_size 64M;
}

我已经将文件夹和端口从8001更改为8002。因此,我得到了:

代码语言:javascript
复制
/etc/nginx/sites-available# more fencing
server {
    server_name fencing.maciejg.pl;

    access_log off;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        alias /home/django/fencing/fencingtournament/static/;
    }

    access_log /home/django/fencing/logs/nginx-access.log;
    error_log /home/django/fencing/logs/nginx-error.log;

    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8002;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
    }
 # managed by Certbot

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/fencing.maciejg.pl/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/fencing.maciejg.pl/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = fencing.maciejg.pl) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    server_name fencing.maciejg.pl;
    listen [::]:80;
    return 404; # managed by Certbot
}

现在,虽然https://xmlanalyzer.maciejg.pl工作得很好,但是我在尝试访问https://fencing.maciejg.pl/时得到了ERR_TOO_MANY_REDIRECTS。

Curl证明了域的正确设置和nginx是可用的。由于某些原因,它不会重定向到我的应用程序:

代码语言:javascript
复制
curl fencing.maciejg.pl
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

这两个网站都可以使用。

代码语言:javascript
复制
ll ../sites-enabled/
total 12
drwxr-xr-x 2 root root 4096 Mar 25 20:39 ./
drwxr-xr-x 6 root root 4096 Mar 25 22:59 ../
lrwxrwxrwx 1 root root   26 Mar 25 20:39 fencing -> ../sites-available/fencing
lrwxrwxrwx 1 root root   30 Feb 23  2018 xmlanalyzer -> ../sites-available/xmlanalyzer

在我看来很不错:

代码语言:javascript
复制
tail gunicorn-error.log
Starting fencing as my-user-name
[2019-03-26 10:20:01 +0000] [780] [INFO] Starting gunicorn 19.7.1
[2019-03-26 10:20:01 +0000] [780] [INFO] Listening at: http://127.0.0.1:8002 (780)
[2019-03-26 10:20:01 +0000] [780] [INFO] Using worker: sync
[2019-03-26 10:20:01 +0000] [787] [INFO] Booting worker with pid: 787
[2019-03-26 10:20:01 +0000] [788] [INFO] Booting worker with pid: 788
[2019-03-26 10:20:02 +0000] [789] [INFO] Booting worker with pid: 789

logs和nginx-error.log在我的/home/django/栅栏/logs中是空的。

我错过了什么?如有任何意见,我将不胜感激。

编辑只是为了添加-如果手动启动应用程序可以访问:

代码语言:javascript
复制
Starting development server at http://159.65.24.62:8002/
[26/Mar/2019 14:24:37] You're accessing the development server over HTTPS, but it only supports HTTP.

这里的错误是意料之中的--这仅仅是为了表明对https://fencing.maciejg.pl:8002/的web请求确实击中了正确的位置,因此域被设置为ok。

编辑2将用于击剑应用程序的nginx设置更改为access_log on;,其结果如下:

代码语言:javascript
复制
more nginx-access.log

37.30.26.37 - - [26/Mar/2019:14:14:04 +0000] "GET / HTTP/1.1" 301 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko
) Chrome/73.0.3683.86 Safari/537.36"
37.30.26.37 - - [26/Mar/2019:14:14:04 +0000] "GET / HTTP/1.1" 301 5 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko
) Chrome/73.0.3683.86 Safari/537.36"

所以我可以看到,请求到达了nginx,并且拒绝了。

使用certbot禁用重定向后,编辑3,我现在在访问http://fencing.maciejg.pl/时获得nginx登陆页面--因此,它再次通过,只是没有重定向到由gunicorn运行的应用程序。所以我仍然相信这是我的nginx设置中的一个bug -但是,我仍然没有看到它.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-28 16:50:06

好了,我终于解决了这个问题!有很多问题。

首先,我在nginx设置中发生了碰撞。尽管部分是,即使我解决了这个问题,我仍然有HTTP错误。这是因为,火鸟的设置是无效的。尽管部分是,即使我解决了这个问题,我仍然有HTTP错误。这是因为Django设置无效。

所以,我一遍又一遍地处理每一件事,我的建议和解决办法是:一步一步地分析。

首先:我已经在开发模式下运行了我的Django应用程序,启动python manage.py runserver 127.0.0.1:8000时禁用了Debug = True和SSL。通过这种方式,通过curl,我能够得到响应并确认其工作正常。

接下来,我杀死了这个应用程序,并通过gunicorn脚本运行它。我发现它抛出了一个错误,因为保存SECRET_KEY的环境变量不可用。老实说-我没能解决这个问题,我把钥匙放在一个单独的文件里。所以,有一个问题解决了,我的枪角跑得很好。

Nest步骤:终止gunicorn进程并使用supervisiord调用它。结果发现,当supervisiord在另一个账户上运行时,出现了一个隐私问题。

一旦解决了这个问题,我就从头开始重新创建nginx安装程序,直到它开始转发请求。没有SSL。

接下来,我重新运行certbot以将SSL放回。在这里,我还发现您需要清除浏览器缓存,因为它没有显示页面,即使下面的设置很好。这也花了一段时间--我偶然发现了这个,因为我试着用不同的笔记本电脑访问我的站点,发现它工作得很好。

最后,我将我的其他nginx服务器配置一个接一个地放回启用的站点中。

我希望我永远不需要这个解决方案,它只会对其他人有用:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55357894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档