ubuntu14.04 - Problème d'erreur de déploiement Flask+Nginx+WSGI
阿神
阿神 2017-05-16 17:17:52
0
3
847

J'ai déployé mon application Flask selon les instructions de Comment servir des applications Flask avec uWSGI et Nginx sur Ubuntu 14.04. Elle peut être déployée avec succès à l'aide de l'exemple simple du didacticiel, mais cela ne fonctionne pas lors du remplacement du fichier d'entrée de l'application par mon. propre, et ce qui est étrange, c'est qu'il est utilisé directement dans l'environnement virtualenv

python wsgi.py

est possible, mais utilisez

uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi

ne fonctionne pas, l'erreur est la suivante :

    dev@ubuntu:~/tests$ uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi
    *** Starting uWSGI 2.0.12 (64bit) on [Sat Apr  9 16:11:05 2016] ***
    compiled with version: 4.8.2 on 08 April 2016 16:57:14
    os: Linux-3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014
    nodename: ubuntu
    machine: x86_64
    clock source: unix
    detected number of CPU cores: 4
    current working directory: /home/xiaoyi/tests
    detected binary path: /home/xiaoyi/tests/env/bin/uwsgi
    !!! no internal routing support, rebuild with pcre support !!!
    *** WARNING: you are running uWSGI without its master process manager ***
    your processes number limit is 7733
    your memory page size is 4096 bytes
    detected max file descriptor number: 1024
    lock engine: pthread robust mutexes
    thunder lock: disabled (you can enable it with --thunder-lock)
    uwsgi socket 0 bound to TCP address 0.0.0.0:5000 fd 3
    Python version: 2.7.6 (default, Jun 22 2015, 18:01:27)  [GCC 4.8.2]
    *** Python threads support is disabled. You can enable it with --enable-threads ***
    Python main interpreter initialized at 0xb98500
    your server socket listen backlog is limited to 100 connections
    your mercy for graceful operations on workers is 60 seconds
    mapped 72768 bytes (71 KB) for 1 cores
    *** Operational MODE: single process ***
    Traceback (most recent call last):
      File "./wsgi.py", line 17, in <module>
        app.run(host=os.getenv('IP', '0.0.0.0'), port = int(os.getenv('PORT',5000)))
      File "/home/xiaoyi/tests/env/local/lib/python2.7/site-packages/flask/app.py", line 772, in run
        run_simple(host, port, self, **options)
      File "/home/xiaoyi/tests/env/local/lib/python2.7/site-packages/werkzeug/serving.py", line 694, in run_simple
        inner()
      File "/home/xiaoyi/tests/env/local/lib/python2.7/site-packages/werkzeug/serving.py", line 656, in inner
        fd=fd)
      File "/home/xiaoyi/tests/env/local/lib/python2.7/site-packages/werkzeug/serving.py", line 550, in make_server
        passthrough_errors, ssl_context, fd=fd)
      File "/home/xiaoyi/tests/env/local/lib/python2.7/site-packages/werkzeug/serving.py", line 464, in __init__
        HTTPServer.__init__(self, (host, int(port)), handler)
      File "/usr/lib/python2.7/SocketServer.py", line 419, in __init__
        self.server_bind()
      File "/usr/lib/python2.7/BaseHTTPServer.py", line 108, in server_bind
        SocketServer.TCPServer.server_bind(self)
      File "/usr/lib/python2.7/SocketServer.py", line 430, in server_bind
        self.socket.bind(self.server_address)
      File "/usr/lib/python2.7/socket.py", line 224, in meth
        return getattr(self._sock,name)(*args)
    socket.error: [Errno 98] Address already in use
    unable to load app 0 (mountpoint='') (callable not found or import error)
    *** no app loaded. going in full dynamic mode ***
    *** uWSGI is running in multiple interpreter mode ***
    spawned uWSGI worker 1 (and the only) (pid: 13702, cores: 1)
    ^A--- no python application found, check your startup logs for errors ---
    [pid: 13702|app: -1|req: -1/1] 14.28.139.49 () {34 vars in 644 bytes} [Sat     Apr  9 16:12:50 2016] GET / => generated 21 bytes in 0 msecs (HTTP/1.1 500) 2 headers in 83 bytes (0 switches on core 0)

Bien que le message d'erreur ci-dessus indique que l'adresse a été utilisée, plusieurs adresses et ports qui occupent l'adresse et le port n'ont pas été ouverts. Je ne comprends pas cela au début, veuillez me donner quelques conseils !

阿神
阿神

闭关修行中......

répondre à tous(3)
某草草

Après une enquête minutieuse, j'ai finalement résolu le problème. Tout d'abord, je posterai le code de mon fichier d'entrée :

#!/usr/bin/env python
# -*-  coding=utf-8 -*-

from application import create_app

__author__ = 'Riky'

app = create_app('idc')

app.run()

Lors de l'exécution directe en utilisant uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi, l'erreur signalée est la même que le message d'erreur posté dans la question, et l'adresse est occupée . Mais l'application correspondante occupée est introuvable dans le processus ou le port. Pourquoi un exemple simple est-il OK ? Je l'ai comparé attentivement : uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi直接执行的时候,报的错如问题中贴的错误提示一样,地址被占用。但是进程中和端口都找不到占用的对应的应用程序,为啥简单的例子可以呢?我仔细对比了下:

from flask import Flask
application = Flask(__name__)

@application.route("/")
def hello():
    return "<h1 style='color:blue'>Hello There!</h1>"

if __name__ == "__main__":
    application.run(host='0.0.0.0')

很明显因为我在IDE中开发中习惯了,而忽略了入口文件最基础的部分:

#入口在没有以下代码的前提下,使用python run.py 是可以执行的
if __name__ == "__main__":
    app.run(host='0.0.0.0')

这样错误就变成了:

*** Operational MODE: single process ***
unable to load app 0 (mountpoint='') (callable not found or import error)

而出现这个错误是一个比较让人无语的问题,uwsgi只能在入口文件识别application,而无法识别我定义的run。之所以会出现端口占用的情况,是因为app.run()实际上也执行了,但并不是uwsgi要加载的应用application

#!/usr/bin/env python
# -*-  coding=utf-8 -*-

from application import create_app

__author__ = 'Riky'

application = create_app('idc')

if __name__ == "__main__":
    application.run()
Évidemment parce que j'ai l'habitude de développer en IDE, j'ai ignoré la partie la plus basique du fichier d'entrée :

rrreee

L'erreur devient :🎜 rrreee 🎜Cette erreur est un problème plutôt sans voix. uwsgi ne peut reconnaître que application dans le fichier d'entrée, mais ne peut pas reconnaître le run que j'ai défini. La raison pour laquelle le port est occupé est que app.run() est réellement exécuté, mais ce n'est pas l'application application qui doit être chargée par uwsgi. 🎜 🎜Enfin, changez-le en :🎜 rrreee
曾经蜡笔没有小新

uwsgi a un fichier de configuration, qui peut définir l'adresse d'accès et le numéro de port. Je pense que l'erreur de phrase socket.error: [Errno 98] Adresse déjà utilisée peut être la raison pour laquelle vous n'avez pas configuré uwsgi. Pour la configuration d'uwsgi et le processus de déploiement du projet flask, vous pouvez vous référer à l'article que j'ai écrit, hehe.
/a/1190000004294...

黄舟

netstat -ntlp Vérifiez si le port est occupé par uwsgi Si oui, ps -ef | grep uwsgi trouve le pid puis tue

.
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal