2

Supervisord 用の次の conf ファイルがあります。

[program:backend]
command=../../../venv/bin/python backend.py

[program:celeryd]
command=../../../venv/bin/celery worker --app=tasks -l debug

[program:memcached]
command=memcached

私の backend.py は、debug=True の非常に標準的なフラスコ アプリです。デーモン化されていません (コンソールで python backend.py を実行してもプロンプトは返されません)

を実行するsupervisordと、次のプロンプトが表示されます。

[venv] supervisor$ supervisord
2013-05-08 18:42:22,148 INFO RPC interface 'supervisor' initialized
2013-05-08 18:42:22,148 CRIT Server 'unix_http_server' running without any HTTP authentication checking
2013-05-08 18:42:22,149 INFO supervisord started with pid 6778
2013-05-08 18:42:23,152 INFO spawned: 'celeryd' with pid 6781
2013-05-08 18:42:23,156 INFO spawned: 'memcached' with pid 6782
2013-05-08 18:42:23,159 INFO spawned: 'backend' with pid 6783
2013-05-08 18:42:24,314 INFO success: celeryd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2013-05-08 18:42:24,314 INFO success: memcached entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2013-05-08 18:42:24,314 INFO success: backend entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

pstree は次のようになります。

 | | \-+= 91117 vng -/bin/bash
 | |   \-+= 06778 vng /Volumes/Data2/Dropbox/projects/Giordano/venv/bin/python /Volumes/Data2/Dropbox/projects/Giordano/venv/bin/supervisord
 | |     |-+= 06781 vng /Volumes/Data2/Dropbox/projects/Giordano/venv/bin/python ../../../venv/bin/celery worker --app=tasks -l debug
 | |     | |--- 06795 vng /Volumes/Data2/Dropbox/projects/Giordano/venv/bin/python ../../../venv/bin/celery worker --app=tasks -l debug
 | |     | |--- 06796 vng /Volumes/Data2/Dropbox/projects/Giordano/venv/bin/python ../../../venv/bin/celery worker --app=tasks -l debug
 | |     | |--- 06797 vng /Volumes/Data2/Dropbox/projects/Giordano/venv/bin/python ../../../venv/bin/celery worker --app=tasks -l debug
 | |     | \--- 06798 vng /Volumes/Data2/Dropbox/projects/Giordano/venv/bin/python ../../../venv/bin/celery worker --app=tasks -l debug
 | |     |--= 06782 vng memcached
 | |     \-+= 06783 vng ../../../venv/bin/python backend.py
 | |       \--- 06790 vng /Volumes/Data2/Dropbox/projects/Giordano/src/giordano/web/../../../venv/bin/python backend.py

スーパーバイザーを殺すと、次のようになります。

^C2013-05-08 18:43:18,305 WARN received SIGINT indicating exit request
2013-05-08 18:43:18,305 INFO waiting for celeryd, memcached, backend to die
2013-05-08 18:43:18,352 INFO stopped: backend (exit status 0)
2013-05-08 18:43:18,353 INFO stopped: memcached (terminated by SIGTERM)
2013-05-08 18:43:18,414 INFO stopped: celeryd (exit status 0)

そしてどこからともなく、backend.py が pstree に置き換わります。

 |--= 41659 root /usr/libexec/taskgated -s
 |--- 42779 vng /usr/local/Cellar/erlang/R15B03-1/lib/erlang/erts-5.9.3.1/bin/epmd -daemon
 |--= 88518 root /usr/sbin/ocspd
 |--- 97815 vng /Applications/Dropbox.app/Contents/MacOS/Dropbox /firstrunupdate 403
 |--= 97905 _usbmuxd /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/usbmuxd -launchd
 \--- 06790 vng /Volumes/Data2/Dropbox/projects/Giordano/src/giordano/web/../../../venv/bin/python backend.py

Supervisord を再起動するたびに、ポートが既に使用されているというエラーが表示されるため、これに悩まされています。

この問題の原因を知っている人はいますか?

編集:

私のbackend.py

app = Flask(__name__)
app.config.from_object(__name__)
app.secret_key = 'asgasdasdgasd'
app.debug = bool(int(os.environ.get("DEBUG", 1)))   # DEBUG=0
if app.debug:
  from giordano.web import colorer # Needed for coloring logging

app.config.update(
  MAIL_SERVER='smtp.gmail.com',
  MAIL_DEBUG=False,
  MAIL_PORT=465,
  MAIL_USE_SSL=True,
  MAIL_USERNAME = 'asdfasdfasdfasdfasdf@asdasdfas.com',
  MAIL_PASSWORD = 'asdfasdfasdfa'
)
mail = Mail(app)    # Very important to do it after!!

log_level = logging.DEBUG if app.debug else logging.INFO
logging.basicConfig(level=log_level, format='%(asctime)s %(levelname)s %(message)s')
logging.info("Launching app with debug=%s" % app.debug)

....

class TimedRequestHandler(BaseRequestHandler):
  """http://blog.sendhub.com/post/48832423565/hacking-flask-a-success-story
  """
  def handle(self):
    self.fancyStarted = time.time()
    rv = super(TimedRequestHandler, self).handle()
    return rv

  def send_response(self, code, message=None):
    self.fancyProcessed = time.time()
    super(TimedRequestHandler, self).send_response(code, message=None)

  def log_request(self, code='-', size='-'):
    duration = int((self.fancyProcessed - self.fancyStarted) * 1000)
    line = '"{0}" {1} {2} [{3}ms]'.format(self.requestline, code, size, duration)
    self.log('info', line)


if __name__ == "__main__":
   init_db() # run if you need to create tables
   app.run(host='0.0.0.0', port=8888, request_handler=TimedRequestHandler)
4

3 に答える 3

0

これが役立つかどうかはわかりませんが、ポートの状況を処理するために nginx を使用することを考えたことがありますか? フラスコはデフォルトでポート 5000 で実行されると思われるため、次のように myapp.conf を作成できます。

server {
    listen 80;
    server_name localhost;

    # location to your app
    root /srv/www/my_app;

    # Don't forget to create log files
    access_log /srv/www/logs/access.log;
    error_log /srv/www/logs/error.log;

    location / {
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://127.0.0.1:5000;
    }
}

その構成を「sites-available」と「sites-enabled」の両方に入れるか、それをシンボリックリンクしますln -s /srv/www/my_app/nginx/my_app.conf /etc/nginx/<sites-available>

アプリケーション ディレクトリは完全に任意ですが、試してみる価値はあります。

于 2013-05-10T21:17:45.237 に答える