推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
sevenQu
V2EX  ›  Python

nginx,127.0.0.1 可以访问,但是 127.0.0.1:8000 就被拒绝访问,为什么?

  •  
  •   sevenQu · Mar 13, 2018 · 14230 views
    This topic created in 3160 days ago, the information mentioned may be changed or developed.

    我想部署在本地,系统是 Ubuntu16.04 ,所以 server_name 是 127.0.0.1

    网页提示

    Try:
    Checking the connection
    Checking the proxy and the firewall
    
    这是我的 ngnix 的配置文件  
    

    server {
    listen 80;
    server_name 127.0.0.1;

        root /home/www/blog;
        access_log /home/www/blog/logs/access.log;
        error_log /home/www/blog/logs/access.log;
    
        location / {  
            proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;  
            proxy_set_header Host $http_host;  
            proxy_redirect off;  
            if (!-f $request_filename) {  
                proxy_pass http://127.0.0.1:8000;  
                break;  
            }  
        }  
    }
    
    Supplement 1  ·  Mar 13, 2018
    我也不知道是怎么改的,目前是这个
    502 Bad Gateway
    Supplement 2  ·  Mar 14, 2018
    各位大佬,目前我使用 gunicorn 和 ngnix 已经可以启动了,很感谢各位。

    我想使用 supervision 启动 gunicorn
    supervision 的配置文件如下,我使用的 pyenv,所以 gunicorn 的路径有点长
    [program:niceblog]
    command=/home/seven/.pyenv/versions/daily/bin/gunicorn run:app -c /home/seven/Desktop/niceblog/gunicorn.conf
    diretory=/home/seven/Desktop/niceblog
    user=root
    autostart=true
    autorestart=true
    tdout_logfile=/home/seven/Desktop/niceblog/logs/gunicorn_supervisor.log

    命令行提示:BACKOFF Exited too quickly

    查询 logs 提示:Failed to find application: 'run'

    感觉我的 run 文件应该没问题,因为我使用 gunicorn 命令行启动的时候就是使用的 run:app
    启动的时候我还专门进入虚拟环境和项目目录,都不行

    希望可以有人指点一下,谢谢
    Supplement 3  ·  Mar 15, 2018

    承蒙各位照顾,我的问题终于解决了,很多人评论,这是我的最后总结,如果有错误欢迎指出,希望可以帮到其他人
    部署flask-gunicorn-nginx-supervisor

    39 replies  •  2018-03-15 10:24:46 +08:00
    xuuuu
    xuuuu
    Mar 13, 2018
    1
    试一下 127.0.0.1:80 就知道了
    sevenQu
    sevenQu
    OP
    Mar 13, 2018
    2
    @xuuuu 是 Welcome to nginx!的页面
    MonoLogueChi
    MonoLogueChi
    Mar 13, 2018 via Android
    3
    你这个配置应该是代理 8000 端口吧,你在 8000 端口是上开了什么服务这应该不关 Nginx 的事吧
    xuuuu
    xuuuu
    Mar 13, 2018
    4
    @sevenQu 观察地址栏变化撒...
    Molita
    Molita
    Mar 13, 2018 via Android
    5
    你确认下你 8000 端口的服务起了没
    sevenQu
    sevenQu
    OP
    Mar 13, 2018
    6
    @Molita 没有,我用的 flask,gunicorn,不知道该怎么办
    wisej
    wisej
    Mar 13, 2018
    7
    @sevenQu gunicorn -b 127.0.0.1:8000
    sevenQu
    sevenQu
    OP
    Mar 13, 2018
    8
    @wisej
    我的启动文件名字是 manage,里面是使用了 flask_script 的 manager.run()启动,不是 app.run ,不知道这个有没有影响

    我用的 gunicorn 配置文件,方便的话,帮我看看有什么不对的
    [program:blog]

    command=/home/blog/env/bin/gunicorn manage:manager -c /home/blog/gunicorn.conf

    directory=/home/blog
    user=www
    autostart=true
    autorestart=true
    stdout_logfile=/home/blog/logs/gunicorn_supervisor.log
    environment = MODE="PRODUCTION"
    a1581076543
    a1581076543
    Mar 13, 2018
    9
    查看端口开启状态和文件夹访问权限
    pkookp8
    pkookp8
    Mar 13, 2018 via Android
    10
    不懂 nginx,大概把 listen 的改为 8000,重新运行一下就行了
    sevenQu
    sevenQu
    OP
    Mar 13, 2018
    11
    @pkookp8 我试试,我也很纳闷,为什么都是用的 8000,而那里 listen 的是 80
    ybping
    ybping
    Mar 13, 2018 via iPhone
    12
    这个 nginx 也没看到配置 8000 端口,直接访问肯定拒绝了吧
    Eleutherios
    Eleutherios
    Mar 13, 2018 via iPhone
    13
    回报 “ sudo netstat -ntpl ” 的输出结果
    sevenQu
    sevenQu
    OP
    Mar 13, 2018
    14
    @Eleutherios
    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1895/mysqld
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1574/nginx -g daemo
    tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN 1429/dnsmasq
    tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 5102/cupsd
    tcp6 0 0 :::80 :::* LISTEN 1574/nginx -g daemo
    tcp6 0 0 ::1:631 :::* LISTEN 5102/cupsd
    这个查询厉害,真没有 8000
    580a388da131
    580a388da131
    Mar 13, 2018
    15
    Flask 默认端口是 5000 啊
    你有改成 8000 吗
    sevenQu
    sevenQu
    OP
    Mar 13, 2018
    16
    @580a388da131
    server = Server(host="127.0.0.1", port=8000)
    manager.add_command("runserver", server)
    这样修改了,试了一下还是不行,是不是不能使用 manageer.run?
    sevenQu
    sevenQu
    OP
    Mar 13, 2018
    17
    @ybping 什么意思?在哪里修改?
    aricxu
    aricxu
    Mar 13, 2018
    18
    你这个配置的意思是开放 80 端口访问,对不存在的文件转发到 8000 端口。也就是在 nginx 后面需要有一个服务在跑,监听端口是 8000。
    ybping
    ybping
    Mar 13, 2018 via iPhone
    19
    @sevenQu listen 8000 ;然后重启 nginx
    sevenQu
    sevenQu
    OP
    Mar 13, 2018
    20
    @aricxu 启动 supervision 的时候,提示
    niceblog: ERROR (spawn error)
    sevenQu
    sevenQu
    OP
    Mar 13, 2018
    21
    @ybping 试了一下,不是提示无法访问,而是 502 bad gateway,感觉 @aricxu 说的挺对的,我目前是 supervision 启动不了
    deloved
    deloved
    Mar 13, 2018
    22
    你本地后端有 8000 端口的服务存在吗?
    Mojy
    Mojy
    Mar 13, 2018
    23
    nginx 好像是要与 uwsgi 配合搞吧?你 uwsgi 配置了吗?
    litter123
    litter123
    Mar 13, 2018
    24
    netstat -an | grep 8000

    截个图看看
    msg7086
    msg7086
    Mar 13, 2018❤️2
    25
    这楼感觉乱得一批啊,特别是那位不懂的大佬,不懂就别来添乱了好不好求你们了。

    =====

    首先这里有俩程序,一个叫 nginx,一个叫 gunicorn。

    nginx
    它的作用是向外提供服务,是面向用户的窗口,所以 listen 需要写 80,root 需要写网站的静态文件目录地址,proxy_pass 需要写后端的监听地址。

    gunicorn
    它的作用是起来你的程序,是面向代码的窗口,对外与 nginx 相连接,所以 listen 写 8000,和上方 proxy_pass 的地址对应。

    =====

    首先,你访问的地址应该是 127.0.0.1,而不是 8000 端口。
    然后,两个程序要同时运行,才能访问到网站。
    至于出现 welcome to nginx,可能是(1)你修改完配置没重载,(2)你写的这段配置没有被执行,(3)你写了其他虚拟主机配置,导致访问时访问了另一个虚拟主机,(4)预装的静态页面你没有删除。

    自己好好查一下吧。

    最后贴两个链接:
    http://gunicorn.org/#quickstart
    http://gunicorn.org/#deployment
    geek123
    geek123
    Mar 13, 2018
    26
    端口没被占了?
    sevenQu
    sevenQu
    OP
    Mar 13, 2018
    27
    @msg7086 老哥,通透,我去学习一下,十分感谢,说实话
    sevenQu
    sevenQu
    OP
    Mar 13, 2018
    28
    @msg7086
    使用 supervisorctl reread 如果不加 sudo 的话提示是这个,我使用的是 pyenv 创建的 3.6.4,我感觉这个出问题了,修改权限可以 reread,但是那个 python2.7 感觉不对,是不是应该改一下,怎么改?

    [Errno 13] Permission denied: file: /usr/lib/python2.7/socket.py line: 228
    lastpass
    lastpass
    Mar 13, 2018 via Android
    29
    日志日志 先看日志。
    meowoo
    meowoo
    Mar 13, 2018 via iPhone
    30
    首先 8000 端口的服务没起来

    然后你 nginx 里配置的难道不是文件不存在才转发到 8000 上? 所以访问存在的最多就是 welcome 了吧 根本没转发
    0x4b0082
    0x4b0082
    Mar 13, 2018
    31
    0.0.0.0:8000 和 127.0.0.1:8000 什么区别?你搞清楚就知道为什么了
    wisej
    wisej
    Mar 13, 2018
    32
    @sevenQu 没有关系,只要你指定的是你所想要启动的 Flask 实例就行。你这里没有指定绑定的地址,就像我说的,你可以尝试加 -b 127.0.0.1:8000,这样才会监听到 8000 端口
    xiaofengchen
    xiaofengchen
    Mar 13, 2018❤️1
    33
    1、首页是 Welcome to nginx 可以看看 /etc/nginx/sites-enabled/路径下是不是只有 default,如果你单独写了配置文件,那么删掉 default,首页就不是“ Welcome to nginx ”了;
    2、检查防火墙有没有允许 8000 端口(不过就算没允许,你 nginx 反向代理后,访问 127.0.0.1:80 应该是能运行的,允许后访问 127.0.0.1:8000 和 80 端口的结果一样,如果有问题那么就先不要管 nginx 这一层,在 gunicorn 和程序上找原因);
    3、如果上面没解决 运行 gunicorn wsgi -c bind = '0.0.0.0:2000' pid = '/tmp/manager.pid' 现在就相当于在运行你的程序,再有问题就是你程序 bug,第三步的前提是你程序配置了 wsgi.py ,这个很简单,百度一下就有。

    希望能帮到你~
    xiaofengchen
    xiaofengchen
    Mar 13, 2018
    34
    @xiaofengchen 第三步的 gunicorn wsgi -c bind = '0.0.0.0:2000' pid = '/tmp/manager.pid' 端口 8000 是这样的
    gunicorn wsgi -c bind = '0.0.0.0:8000' pid = '/tmp/manager.pid' 具体细节可百度,大概是这个思路,不过我一般是三二一,每一步没问题了才下一步。。
    thulof
    thulof
    Mar 13, 2018
    35
    这句改一下,server = Server(host="0.0.0.0", port=8000) ,试试
    ipwx
    ipwx
    Mar 13, 2018
    36
    话说,@sevenQu 你虽然用了 gunicorn 但是你 nginx 没用 wsgi 协议诶,nginx 配置的是假设 8000 为 http 协议。

    https://docs.nginx.com/nginx/admin-guide/web-server/app-gateway-uwsgi-django/
    sevenQu
    sevenQu
    OP
    Mar 13, 2018
    37
    @xiaofengchen
    很开心,按照你的 321 的步骤走,gunicorn 使用命令行启动成功了,ngnix 也可以了,网站成功走起
    但是 gunicorn 命令行启动后,那个命令窗口好像不能继续使用了

    我之前看的教程是使用 supervision 通过 gunicorn 配置文件启动的,不知道为什么用配置文件启动不了,我很纳闷,这是 supervision 的配置文件

    [program:niceblog]
    command=/home/seven/.pyenv/versions/daily/bin/gunicorn run:app -c /home/seven/Desktop/niceblog/gunicorn.conf
    diretory=/home/seven/Desktop/niceblog
    user=root
    autostart=true
    autorestart=true
    tdout_logfile=/home/seven/Desktop/niceblog/logs/gunicorn_supervisor.log


    gunicorn 的配置文件很简单
    workers=3
    bind='127.0.0.1:8000'

    感觉关键是 supervision 的 command 那一行
    /home/seven/.pyenv/versions/daily/bin/gunicorn 这是我用 pyenv 搭建的 flask 环境,gunicorn 所在位置

    求解,谢谢
    lightening
    lightening
    Mar 13, 2018
    38
    @sevenQu 你要从非本机访问的话,gunicorn 要 bind 0.0.0.0:8000 吧。127.0.0.1 只能从服务器本机访问。
    POPOEVER
    POPOEVER
    Mar 15, 2018
    39
    前两天正好在写在 CentOS 上跑 Node/Express 应用的一个快速指南,本来想可能大家都知道就不写了,看来我们都是从小白白赤手空拳过来的,还是有这类需求的是吧,哈哈
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1947 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 110ms · UTC 01:53 · PVG 09:53 · LAX 17:53 · JFK 20:53
    ♥ Do have faith in what you're doing.