V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2018-03-13 11:50:31 +08:00 · 12993 次点击
    这是一个创建于 2440 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想部署在本地,系统是 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;  
            }  
        }  
    }
    
    第 1 条附言  ·  2018-03-13 12:26:50 +08:00
    我也不知道是怎么改的,目前是这个
    502 Bad Gateway
    第 2 条附言  ·  2018-03-14 10:58:18 +08:00
    各位大佬,目前我使用 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
    启动的时候我还专门进入虚拟环境和项目目录,都不行

    希望可以有人指点一下,谢谢
    第 3 条附言  ·  2018-03-15 23:29:51 +08:00

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

    39 条回复    2018-03-15 10:24:46 +08:00
    xuuuu
        1
    xuuuu  
       2018-03-13 11:53:38 +08:00
    试一下 127.0.0.1:80 就知道了
    sevenQu
        2
    sevenQu  
    OP
       2018-03-13 11:54:23 +08:00
    @xuuuu 是 Welcome to nginx!的页面
    MonoLogueChi
        3
    MonoLogueChi  
       2018-03-13 11:56:56 +08:00 via Android
    你这个配置应该是代理 8000 端口吧,你在 8000 端口是上开了什么服务这应该不关 Nginx 的事吧
    xuuuu
        4
    xuuuu  
       2018-03-13 12:00:48 +08:00
    @sevenQu 观察地址栏变化撒...
    Molita
        5
    Molita  
       2018-03-13 12:01:07 +08:00 via Android
    你确认下你 8000 端口的服务起了没
    sevenQu
        6
    sevenQu  
    OP
       2018-03-13 12:05:24 +08:00
    @Molita 没有,我用的 flask,gunicorn,不知道该怎么办
    wisej
        7
    wisej  
       2018-03-13 12:06:41 +08:00
    @sevenQu gunicorn -b 127.0.0.1:8000
    sevenQu
        8
    sevenQu  
    OP
       2018-03-13 12:12:49 +08:00
    @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  
       2018-03-13 12:16:00 +08:00
    查看端口开启状态和文件夹访问权限
    pkookp8
        10
    pkookp8  
       2018-03-13 12:16:02 +08:00 via Android
    不懂 nginx,大概把 listen 的改为 8000,重新运行一下就行了
    sevenQu
        11
    sevenQu  
    OP
       2018-03-13 12:18:33 +08:00
    @pkookp8 我试试,我也很纳闷,为什么都是用的 8000,而那里 listen 的是 80
    ybping
        12
    ybping  
       2018-03-13 12:19:36 +08:00 via iPhone
    这个 nginx 也没看到配置 8000 端口,直接访问肯定拒绝了吧
    Eleutherios
        13
    Eleutherios  
       2018-03-13 12:20:18 +08:00 via iPhone
    回报 “ sudo netstat -ntpl ” 的输出结果
    sevenQu
        14
    sevenQu  
    OP
       2018-03-13 12:24:06 +08:00
    @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  
       2018-03-13 12:27:23 +08:00
    Flask 默认端口是 5000 啊
    你有改成 8000 吗
    sevenQu
        16
    sevenQu  
    OP
       2018-03-13 12:41:15 +08:00
    @580a388da131
    server = Server(host="127.0.0.1", port=8000)
    manager.add_command("runserver", server)
    这样修改了,试了一下还是不行,是不是不能使用 manageer.run?
    sevenQu
        17
    sevenQu  
    OP
       2018-03-13 12:43:42 +08:00
    @ybping 什么意思?在哪里修改?
    aricxu
        18
    aricxu  
       2018-03-13 12:47:00 +08:00
    你这个配置的意思是开放 80 端口访问,对不存在的文件转发到 8000 端口。也就是在 nginx 后面需要有一个服务在跑,监听端口是 8000。
    ybping
        19
    ybping  
       2018-03-13 13:03:50 +08:00 via iPhone
    @sevenQu listen 8000 ;然后重启 nginx
    sevenQu
        20
    sevenQu  
    OP
       2018-03-13 13:07:13 +08:00
    @aricxu 启动 supervision 的时候,提示
    niceblog: ERROR (spawn error)
    sevenQu
        21
    sevenQu  
    OP
       2018-03-13 13:10:23 +08:00
    @ybping 试了一下,不是提示无法访问,而是 502 bad gateway,感觉 @aricxu 说的挺对的,我目前是 supervision 启动不了
    xiayun
        22
    xiayun  
       2018-03-13 14:42:48 +08:00
    你本地后端有 8000 端口的服务存在吗?
    Mojy
        23
    Mojy  
       2018-03-13 15:06:52 +08:00
    nginx 好像是要与 uwsgi 配合搞吧?你 uwsgi 配置了吗?
    litter123
        24
    litter123  
       2018-03-13 15:22:44 +08:00
    netstat -an | grep 8000

    截个图看看
    msg7086
        25
    msg7086  
       2018-03-13 15:36:40 +08:00   ❤️ 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  
       2018-03-13 15:41:54 +08:00
    端口没被占了?
    sevenQu
        27
    sevenQu  
    OP
       2018-03-13 15:42:14 +08:00
    @msg7086 老哥,通透,我去学习一下,十分感谢,说实话
    sevenQu
        28
    sevenQu  
    OP
       2018-03-13 18:38:54 +08:00
    @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  
       2018-03-13 18:50:27 +08:00 via Android
    日志日志 先看日志。
    meowoo
        30
    meowoo  
       2018-03-13 18:56:45 +08:00 via iPhone
    首先 8000 端口的服务没起来

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

    https://docs.nginx.com/nginx/admin-guide/web-server/app-gateway-uwsgi-django/
    sevenQu
        37
    sevenQu  
    OP
       2018-03-13 22:46:50 +08:00
    @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  
       2018-03-13 22:53:04 +08:00
    @sevenQu 你要从非本机访问的话,gunicorn 要 bind 0.0.0.0:8000 吧。127.0.0.1 只能从服务器本机访问。
    POPOEVER
        39
    POPOEVER  
       2018-03-15 10:24:46 +08:00
    前两天正好在写在 CentOS 上跑 Node/Express 应用的一个快速指南,本来想可能大家都知道就不写了,看来我们都是从小白白赤手空拳过来的,还是有这类需求的是吧,哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1443 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 17:41 · PVG 01:41 · LAX 09:41 · JFK 12:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.