Я пытаюсь ускорить Django
, используя Gunicorn
У меня есть Dockerfile
, например:
FROM python:3.6.8-stretch
RUN apt-get update && apt-get install -y --no-install-recommends nginx netcat postgresql-client
COPY requirements.txt /opt/
RUN pip install -r /opt/requirements.txt
RUN mkdir -p /run/nginx
RUN chmod +x /opt/my_turbo_app/deploy/docker/run-scripts/entrypoint.sh
ENTRYPOINT ["/opt/my_turbo_app/deploy/docker/run-scripts/entrypoint.sh"]
An entrypoint.sh
как:
exec nginx &
gunicorn wsgi:application --bind 0.0.0.0:8000 --timeout 240 --workers 7 --log-file=- --log-level debug
И requirements.txt
с:
gevent==20.5.0
gunicorn==20.0.4
django==2.2.6
djangorestframework==3.10.3
Я создаю Dockerfile
без ошибок:
$ docker build -t my-turbo-app:latest
, а затем запускаю его с:
$ docker run --rm -p 6379:6379 -d --name redis redis
$ docker run --rm -p 5432:5432 -d -e POSTGRES_HOST_AUTH_METHOD=trust --name postgres postgres
$ docker exec -it postgres psql -U postgres -h 127.0.0.1 -c 'CREATE DATABASE turbo_db;'
$ docker run -d --name my-turbo-app --link postgres:localhost --link redis:localhost -p 8000:8000 my-turbo-app:latest
Контейнер my-turbo-app
раскручивается на секунду, потом вылетает.
Запуск docker logs my-turbo-app
показывает:
+ gunicorn wsgi:application --bind 0.0.0.0:8000 --timeout 240 --workers 7 -k gevent --log-file=- --log-level debug
+ exec nginx
[2020-05-08 04:17:54 +0000] [8] [DEBUG] Current configuration:
config: None
bind: ['0.0.0.0:8000']
backlog: 2048
workers: 7
worker_class: gevent
threads: 1
worker_connections: 1000
max_requests: 0
max_requests_jitter: 0
timeout: 240
graceful_timeout: 30
keepalive: 2
limit_request_line: 4094
limit_request_fields: 100
limit_request_field_size: 8190
reload: False
reload_engine: auto
reload_extra_files: []
spew: False
check_config: False
preload_app: False
sendfile: None
reuse_port: False
chdir: /opt/my_turbo_app
daemon: False
raw_env: []
pidfile: None
worker_tmp_dir: None
user: 0
group: 0
umask: 0
initgroups: False
tmp_upload_dir: None
secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'}
forwarded_allow_ips: ['127.0.0.1']
accesslog: None
disable_redirect_access_to_syslog: False
access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
errorlog: -
loglevel: debug
capture_output: False
logger_class: gunicorn.glogging.Logger
logconfig: None
logconfig_dict: {}
syslog_addr: udp://localhost:514
syslog: False
syslog_prefix: None
syslog_facility: user
enable_stdio_inheritance: False
statsd_host: None
dogstatsd_tags:
statsd_prefix:
proc_name: None
default_proc_name: wsgi:application
pythonpath: None
paste: None
on_starting: <function OnStarting.on_starting at 0x7fc906cecae8>
on_reload: <function OnReload.on_reload at 0x7fc906cecbf8>
when_ready: <function WhenReady.when_ready at 0x7fc906cecd08>
pre_fork: <function Prefork.pre_fork at 0x7fc906cece18>
post_fork: <function Postfork.post_fork at 0x7fc906cecf28>
post_worker_init: <function PostWorkerInit.post_worker_init at 0x7fc906d050d0>
worker_int: <function WorkerInt.worker_int at 0x7fc906d051e0>
worker_abort: <function WorkerAbort.worker_abort at 0x7fc906d052f0>
pre_exec: <function PreExec.pre_exec at 0x7fc906d05400>
pre_request: <function PreRequest.pre_request at 0x7fc906d05510>
post_request: <function PostRequest.post_request at 0x7fc906d05598>
child_exit: <function ChildExit.child_exit at 0x7fc906d056a8>
worker_exit: <function WorkerExit.worker_exit at 0x7fc906d057b8>
nworkers_changed: <function NumWorkersChanged.nworkers_changed at 0x7fc906d058c8>
on_exit: <function OnExit.on_exit at 0x7fc906d059d8>
proxy_protocol: False
proxy_allow_ips: ['127.0.0.1']
keyfile: None
certfile: None
ssl_version: 2
cert_reqs: 0
ca_certs: None
suppress_ragged_eofs: True
do_handshake_on_connect: False
ciphers: None
raw_paste_global_conf: []
strip_header_spaces: False
[2020-05-08 04:17:54 +0000] [8] [INFO] Starting gunicorn 20.0.4
[2020-05-08 04:17:54 +0000] [8] [ERROR] Connection in use: ('0.0.0.0', 8000)
[2020-05-08 04:17:54 +0000] [8] [DEBUG] connection to ('0.0.0.0', 8000) failed: [Errno 98] Address already in use
[2020-05-08 04:17:54 +0000] [8] [ERROR] Retrying in 1 second.
[2020-05-08 04:17:55 +0000] [8] [ERROR] Connection in use: ('0.0.0.0', 8000)
[2020-05-08 04:17:55 +0000] [8] [DEBUG] connection to ('0.0.0.0', 8000) failed: [Errno 98] Address already in use
[2020-05-08 04:17:55 +0000] [8] [ERROR] Retrying in 1 second.
[2020-05-08 04:17:56 +0000] [8] [ERROR] Connection in use: ('0.0.0.0', 8000)
[2020-05-08 04:17:56 +0000] [8] [DEBUG] connection to ('0.0.0.0', 8000) failed: [Errno 98] Address already in use
[2020-05-08 04:17:56 +0000] [8] [ERROR] Retrying in 1 second.
[2020-05-08 04:17:57 +0000] [8] [ERROR] Connection in use: ('0.0.0.0', 8000)
[2020-05-08 04:17:57 +0000] [8] [DEBUG] connection to ('0.0.0.0', 8000) failed: [Errno 98] Address already in use
[2020-05-08 04:17:57 +0000] [8] [ERROR] Retrying in 1 second.
[2020-05-08 04:17:58 +0000] [8] [ERROR] Connection in use: ('0.0.0.0', 8000)
[2020-05-08 04:17:58 +0000] [8] [DEBUG] connection to ('0.0.0.0', 8000) failed: [Errno 98] Address already in use
[2020-05-08 04:17:58 +0000] [8] [ERROR] Retrying in 1 second.
[2020-05-08 04:17:59 +0000] [8] [ERROR] Can't connect to ('0.0.0.0', 8000)
Я пытался привязать разные порты, но, похоже, это не сработало. Как заставить Gunincorn работать с docker?