

### 背景

これまでEC2にデプロイしていたブログシステムをAWS
EKSクラスタ上への移行を行っています。既存システムのEC2上では、Webサーバ(nginx)コンテナと、APサーバ(django +
gunicorn)コンテナの2つのコンテナで動作しており正常に、ブラウザからアクセスすることができます。そこでAWS
EKS上のノード(EC2)に同じようにデプロイしたところ、ブラウザからアクセスすることができず、「502 Bad
Gateway」と表示され、gunicornのログでは、ブラウザアクセスのタイミングで「[CRITICAL] WORKER TIMEOUT
(pid:18294)」のメッセージが表示されています。現在、この原因を調査しているのですが、分かっていないのが現状です。どなたか、心当たりがありましたら、ご教示いただけると幸いです。

### gunicornのログ・ステータス

[code]

    root@blogsystem-apserver01:/# systemctl status gunicorn
    ● gunicorn.service - gunicorn daemon
         Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
         Active: active (running) since Sun 2021-05-09 08:57:19 UTC; 5 days ago
       Main PID: 18291 (gunicorn)
          Tasks: 4 (limit: 4636)
         Memory: 95.8M
         CGroup: /kubepods/besteffort/podd270872c-cc5b-4a3b-92ed-f463ee5f5d77/1eafc79ffd656ff1c1bc39175ee06c7a5ca8692715c5e2bfe2f979d8718411ba/system.slice/gunicorn.service
                 ├─18291 /home/ubuntu/python3/bin/python /home/ubuntu/python3/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/socket/myproject.sock myproject.wsgi:a
    pplication
                 ├─18295 /home/ubuntu/python3/bin/python /home/ubuntu/python3/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/socket/myproject.sock myproject.wsgi:a
    pplication
                 ├─18299 /home/ubuntu/python3/bin/python /home/ubuntu/python3/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/socket/myproject.sock myproject.wsgi:a
    pplication
                 └─18300 /home/ubuntu/python3/bin/python /home/ubuntu/python3/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/socket/myproject.sock myproject.wsgi:a
    pplication
    
    May 09 08:57:20 blogsystem-apserver01 gunicorn[18291]: [2021-05-09 08:57:20 +0000] [18291] [INFO] Starting gunicorn 20.0.4
    May 09 08:57:20 blogsystem-apserver01 gunicorn[18291]: [2021-05-09 08:57:20 +0000] [18291] [INFO] Listening at: unix:/home/ubuntu/socket/myproject.sock (18291)
    May 09 08:57:20 blogsystem-apserver01 gunicorn[18291]: [2021-05-09 08:57:20 +0000] [18291] [INFO] Using worker: sync
    May 09 08:57:20 blogsystem-apserver01 gunicorn[18293]: [2021-05-09 08:57:20 +0000] [18293] [INFO] Booting worker with pid: 18293
    May 09 08:57:20 blogsystem-apserver01 gunicorn[18294]: [2021-05-09 08:57:20 +0000] [18294] [INFO] Booting worker with pid: 18294
    May 09 08:57:20 blogsystem-apserver01 gunicorn[18295]: [2021-05-09 08:57:20 +0000] [18295] [INFO] Booting worker with pid: 18295
    May 09 08:57:59 blogsystem-apserver01 gunicorn[18291]: [2021-05-09 08:57:59 +0000] [18291] [CRITICAL] WORKER TIMEOUT (pid:18293)
    May 09 08:58:00 blogsystem-apserver01 gunicorn[18299]: [2021-05-09 08:58:00 +0000] [18299] [INFO] Booting worker with pid: 18299
    May 09 08:58:01 blogsystem-apserver01 gunicorn[18291]: [2021-05-09 08:58:01 +0000] [18291] [CRITICAL] WORKER TIMEOUT (pid:18294)
    May 09 08:58:02 blogsystem-apserver01 gunicorn[18300]: [2021-05-09 08:58:02 +0000] [18300] [INFO] Booting worker with pid: 18300
    root@blogsystem-apserver01:/# 
    
[/code]

### 更に調べたこと

色々と調べたのですが、断定はできないのですが、gunicornの「sync」ワーカーを「givent」ワーカーに変更することで、解消できる可能性があるようです。

**参考:**  
<https://github.com/benoitc/gunicorn/issues/1194>

以下の通りgunicornの設定ファイルを編集して「givent」ワーカーに変更しようと試みたのですが、gunicornを再起動して、ステータスを見ると、「RuntimeError:
gevent worker requires gevent 1.4 or
higher」と表示され、gunicornを起動することができません。そして、「python3 -m pip install
gevent」で1.4以上のバージョンのgeventをインストールしたのですが、再度、「RuntimeError: gevent worker
requires gevent 1.4 or higher」と表示されます。この件も上記、gunicornの「WORKER
TIMEOUT」に関連性がある可能性もあると思いますので、解決方法に心当たりの方がおりましたら、ご教示いただけると幸いです。

・gunicorn設定ファイル

[code]

    (python3) ubuntu@blogsystem-apserver01:/etc/systemd/system$ more gunicorn.service 
    [Unit]
    Description=gunicorn daemon
    After=network.target
    
    [Service]
    User=ubuntu
    Group=www-data
    WorkingDirectory=/home/ubuntu/myproject
    ExecStart=/home/ubuntu/python3/bin/gunicorn --access-logfile - --workers 3 --worker-class gevent --bind unix:/home/ubuntu/socket/myproject.sock myproject.wsgi:application
    
    [Install]
    WantedBy=multi-user.target
    (python3) ubuntu@blogsystem-apserver01:/etc/systemd/system$ 
    
[/code]

・gunicornステータス

[code]

    root@blogsystem-apserver01:/etc/systemd/system# systemctl status gunicorn
    ● gunicorn.service - gunicorn daemon
         Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
         Active: failed (Result: exit-code) since Sat 2021-05-15 02:30:08 UTC; 1s ago
        Process: 19182 ExecStart=/home/ubuntu/python3/bin/gunicorn --access-logfile - --workers 3 --worker-class gevent --bind unix:/home/ubuntu/socket/myproject.sock myproject.wsgi:a
    pplication (code=exited, status=1/FAILURE)
       Main PID: 19182 (code=exited, status=1/FAILURE)
    
    May 15 02:30:08 blogsystem-apserver01 gunicorn[19182]:   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
    May 15 02:30:08 blogsystem-apserver01 gunicorn[19182]:   File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
    May 15 02:30:08 blogsystem-apserver01 gunicorn[19182]:   File "<frozen importlib._bootstrap_external>", line 783, in exec_module
    May 15 02:30:08 blogsystem-apserver01 gunicorn[19182]:   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
    May 15 02:30:08 blogsystem-apserver01 gunicorn[19182]:   File "/home/ubuntu/python3/lib/python3.8/site-packages/gunicorn/workers/ggevent.py", line 16, in <module>
    May 15 02:30:08 blogsystem-apserver01 gunicorn[19182]:     raise RuntimeError("gevent worker requires gevent 1.4 or higher")
    May 15 02:30:08 blogsystem-apserver01 gunicorn[19182]: RuntimeError: gevent worker requires gevent 1.4 or higher
    May 15 02:30:08 blogsystem-apserver01 gunicorn[19182]: ]
    May 15 02:30:08 blogsystem-apserver01 systemd[1]: gunicorn.service: Main process exited, code=exited, status=1/FAILURE
    May 15 02:30:08 blogsystem-apserver01 systemd[1]: gunicorn.service: Failed with result 'exit-code'.
    root@blogsystem-apserver01:/etc/systemd/system#
    
[/code]

・geventワーカーのインストール

[code]

    root@blogsystem-apserver01:/etc/systemd/system# python3 -m pip install gevent 
    Requirement already satisfied: gevent in /usr/local/lib/python3.8/dist-packages (1.4.0)
    Requirement already satisfied: greenlet>=0.4.14 in /usr/local/lib/python3.8/dist-packages (from gevent) (1.1.0)
    WARNING: Running pip as root will break packages and permissions. You should install packages reliably by using venv: https://pip.pypa.io/warnings/venv
    root@blogsystem-apserver01:/etc/systemd/system# 
    
[/code]

・geventワーカーのインストール後、再起動後のgunicornステータス

[code]

    root@blogsystem-apserver01:/etc/systemd/system# systemctl restart gunicorn
    root@blogsystem-apserver01:/etc/systemd/system# 
    root@blogsystem-apserver01:/etc/systemd/system# systemctl status gunicorn
    ● gunicorn.service - gunicorn daemon
         Loaded: loaded (/etc/systemd/system/gunicorn.service; enabled; vendor preset: enabled)
         Active: failed (Result: exit-code) since Sat 2021-05-15 03:08:42 UTC; 1s ago
        Process: 19196 ExecStart=/home/ubuntu/python3/bin/gunicorn --access-logfile - --workers 3 --worker-class gevent --bind unix:/home/ubuntu/socket/myproject.sock myproject.wsgi:a
    pplication (code=exited, status=1/FAILURE)
       Main PID: 19196 (code=exited, status=1/FAILURE)
    
    May 15 03:08:42 blogsystem-apserver01 gunicorn[19196]:   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
    May 15 03:08:42 blogsystem-apserver01 gunicorn[19196]:   File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
    May 15 03:08:42 blogsystem-apserver01 gunicorn[19196]:   File "<frozen importlib._bootstrap_external>", line 783, in exec_module
    May 15 03:08:42 blogsystem-apserver01 gunicorn[19196]:   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
    May 15 03:08:42 blogsystem-apserver01 gunicorn[19196]:   File "/home/ubuntu/python3/lib/python3.8/site-packages/gunicorn/workers/ggevent.py", line 16, in <module>
    May 15 03:08:42 blogsystem-apserver01 gunicorn[19196]:     raise RuntimeError("gevent worker requires gevent 1.4 or higher")
    May 15 03:08:42 blogsystem-apserver01 gunicorn[19196]: RuntimeError: gevent worker requires gevent 1.4 or higher
    May 15 03:08:42 blogsystem-apserver01 gunicorn[19196]: ]
    May 15 03:08:42 blogsystem-apserver01 systemd[1]: gunicorn.service: Main process exited, code=exited, status=1/FAILURE
    May 15 03:08:42 blogsystem-apserver01 systemd[1]: gunicorn.service: Failed with result 'exit-code'.
    root@blogsystem-apserver01:/etc/systemd/system# 
    
[/code]


CC BY-SA 4.0
2021-05-15T03:28:16.457
75845
2023-08-26T08:27:13.307
2023-08-26T08:27:13.307
3060
44363
question
docker django amazon-eks
EKSにデプロイしたブログシステムのgunicornサーバが「WORKER TIMEOUT」となる


自己解決いたしました。お騒がせして申し訳ございません。

原因は、元々既存環境(AWS)で使用していたRDSのVPCと、新規に構築したAWS
EKSクラスタのVPCが異なっておりました。そのため、APサーバがRDSに接続することができずに、gunicornがタイムアウトしておりました。ESKとRDSを同じVPCに設置したところ、ブラウザからのアクセスが可能となり、問題が解消されました。


CC BY-SA 4.0
2021-05-15T13:16:48.100
75849
2021-05-15T13:16:48.100
44363
75845
answer