V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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 · 13712 views
    This topic created in 2970 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
        1
    xuuuu  
       Mar 13, 2018
    试一下 127.0.0.1:80 就知道了
    sevenQu
        2
    sevenQu  
    OP
       Mar 13, 2018
    @xuuuu 是 Welcome to nginx!的页面
    MonoLogueChi
        3
    MonoLogueChi  
       Mar 13, 2018 via Android
    你这个配置应该是代理 8000 端口吧,你在 8000 端口是上开了什么服务这应该不关 Nginx 的事吧
    xuuuu
        4
    xuuuu  
       Mar 13, 2018
    @sevenQu 观察地址栏变化撒...
    Molita
        5
    Molita  
       Mar 13, 2018 via Android
    你确认下你 8000 端口的服务起了没
    sevenQu
        6
    sevenQu  
    OP
       Mar 13, 2018
    @Molita 没有,我用的 flask,gunicorn,不知道该怎么办
    wisej
        7
    wisej  
       Mar 13, 2018
    @sevenQu gunicorn -b 127.0.0.1:8000
    sevenQu
        8
    sevenQu  
    OP
       Mar 13, 2018
    @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
        9
    a1581076543  
       Mar 13, 2018
    查看端口开启状态和文件夹访问权限
    pkookp8
        10
    pkookp8  
       Mar 13, 2018 via Android
    不懂 nginx,大概把 listen 的改为 8000,重新运行一下就行了
    sevenQu
        11
    sevenQu  
    OP
       Mar 13, 2018
    @pkookp8 我试试,我也很纳闷,为什么都是用的 8000,而那里 listen 的是 80
    ybping
        12
    ybping  
       Mar 13, 2018 via iPhone
    这个 nginx 也没看到配置 8000 端口,直接访问肯定拒绝了吧
    Eleutherios
        13
    Eleutherios  
       Mar 13, 2018 via iPhone
    回报 “ sudo netstat -ntpl ” 的输出结果
    sevenQu
        14
    sevenQu  
    OP
       Mar 13, 2018
    @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
        15
    580a388da131  
       Mar 13, 2018
    Flask 默认端口是 5000 啊
    你有改成 8000 吗
    sevenQu
        16
    sevenQu  
    OP
       Mar 13, 2018
    @580a388da131
    server = Server(host="127.0.0.1", port=8000)
    manager.add_command("runserver", server)
    这样修改了,试了一下还是不行,是不是不能使用 manageer.run?
    sevenQu
        17
    sevenQu  
    OP
       Mar 13, 2018
    @ybping 什么意思?在哪里修改?
    aricxu
        18
    aricxu  
       Mar 13, 2018
    你这个配置的意思是开放 80 端口访问,对不存在的文件转发到 8000 端口。也就是在 nginx 后面需要有一个服务在跑,监听端口是 8000。
    ybping
        19
    ybping  
       Mar 13, 2018 via iPhone
    @sevenQu listen 8000 ;然后重启 nginx
    sevenQu
        20
    sevenQu  
    OP
       Mar 13, 2018
    @aricxu 启动 supervision 的时候,提示
    niceblog: ERROR (spawn error)
    sevenQu
        21
    sevenQu  
    OP
       Mar 13, 2018
    @ybping 试了一下,不是提示无法访问,而是 502 bad gateway,感觉 @aricxu 说的挺对的,我目前是 supervision 启动不了
    deloved
        22
    deloved  
       Mar 13, 2018
    你本地后端有 8000 端口的服务存在吗?
    Mojy
        23
    Mojy  
       Mar 13, 2018
    nginx 好像是要与 uwsgi 配合搞吧?你 uwsgi 配置了吗?
    litter123
        24
    litter123  
       Mar 13, 2018
    netstat -an | grep 8000

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

    =====

    首先这里有俩程序,一个叫 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
        26
    geek123  
       Mar 13, 2018
    端口没被占了?
    sevenQu
        27
    sevenQu  
    OP
       Mar 13, 2018
    @msg7086 老哥,通透,我去学习一下,十分感谢,说实话
    sevenQu
        28
    sevenQu  
    OP
       Mar 13, 2018
    @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
        29
    lastpass  
       Mar 13, 2018 via Android
    日志日志 先看日志。
    meowoo
        30
    meowoo  
       Mar 13, 2018 via iPhone
    首先 8000 端口的服务没起来

    然后你 nginx 里配置的难道不是文件不存在才转发到 8000 上? 所以访问存在的最多就是 welcome 了吧 根本没转发
    0x4b0082
        31
    0x4b0082  
       Mar 13, 2018
    0.0.0.0:8000 和 127.0.0.1:8000 什么区别?你搞清楚就知道为什么了
    wisej
        32
    wisej  
       Mar 13, 2018
    @sevenQu 没有关系,只要你指定的是你所想要启动的 Flask 实例就行。你这里没有指定绑定的地址,就像我说的,你可以尝试加 -b 127.0.0.1:8000,这样才会监听到 8000 端口
    xiaofengchen
        33
    xiaofengchen  
       Mar 13, 2018   ❤️ 1
    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
        34
    xiaofengchen  
       Mar 13, 2018
    @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
        35
    thulof  
       Mar 13, 2018
    这句改一下,server = Server(host="0.0.0.0", port=8000) ,试试
    ipwx
        36
    ipwx  
       Mar 13, 2018
    话说,@sevenQu 你虽然用了 gunicorn 但是你 nginx 没用 wsgi 协议诶,nginx 配置的是假设 8000 为 http 协议。

    https://docs.nginx.com/nginx/admin-guide/web-server/app-gateway-uwsgi-django/
    sevenQu
        37
    sevenQu  
    OP
       Mar 13, 2018
    @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
        38
    lightening  
       Mar 13, 2018
    @sevenQu 你要从非本机访问的话,gunicorn 要 bind 0.0.0.0:8000 吧。127.0.0.1 只能从服务器本机访问。
    POPOEVER
        39
    POPOEVER  
       Mar 15, 2018
    前两天正好在写在 CentOS 上跑 Node/Express 应用的一个快速指南,本来想可能大家都知道就不写了,看来我们都是从小白白赤手空拳过来的,还是有这类需求的是吧,哈哈
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   861 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 73ms · UTC 22:19 · PVG 06:19 · LAX 15:19 · JFK 18:19
    ♥ Do have faith in what you're doing.