backend وابسته به ترمینال برای بهره‌برداری مناسب نیست. امشب یک برنامهٔ WSGI، یعنی قرارداد اجرای وب پایتونی، را با حساب مستقل و Gunicorn راه می‌اندازیم.

این جلسه بخشی از دورهٔ انجین‌اکس در ۵۰ شب است. قرارداد آزمایشگاه، مسیرها و روال اعمال تغییر در راهنمای دوره آمده است.

محیط: LAB_PYTHON با venv/pip آماده؛ APP_CONF سالم. این backend روی 8088 از نمونه‌های قبلی مستقل است.

حساب و برنامه#

sudo useradd --system --home-dir /opt/nginx-lab-app --shell /usr/sbin/nologin nginxapp
sudo install -d -o root -g nginxapp -m 750 /opt/nginx-lab-app
sudo "$LAB_PYTHON" -m venv /opt/nginx-lab-app/venv
sudo /opt/nginx-lab-app/venv/bin/python -m pip install gunicorn
sudo /opt/nginx-lab-app/venv/bin/python -m pip freeze | sudo tee /opt/nginx-lab-app/requirements.txt >/dev/null

فایل root-owned app.py با حالت 644:

def application(environ, start_response):
    body = b"nginx lab application OK\n"
    start_response("200 OK", [("Content-Type", "text/plain"),
                              ("Content-Length", str(len(body)))])
    return [body]

فایل /etc/systemd/system/nginx-lab-app.service:

[Unit]
Description=Nginx lab application
After=network.target
[Service]
User=nginxapp
Group=nginxapp
WorkingDirectory=/opt/nginx-lab-app
ExecStart=/opt/nginx-lab-app/venv/bin/gunicorn --workers 2 --bind 127.0.0.1:8088 --access-logfile - app:application
Restart=on-failure
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
[Install]
WantedBy=multi-user.target

پس از ذخیرهٔ app.py در /opt/nginx-lab-app و فایل unit، به‌ترتیب اجرا کن:

sudo systemd-analyze verify /etc/systemd/system/nginx-lab-app.service
sudo systemctl daemon-reload
sudo systemctl enable --now nginx-lab-app
curl --fail http://127.0.0.1:8088/
sudo journalctl -u nginx-lab-app -n 30 --no-pager

فقط بعد از پاسخ مستقیم سالم، proxy_pass ریشهٔ app را به همین پورت تغییر بده و nginx -t/reload بگیر؛ ws/events مستقل می‌مانند. در Alma/Rocky مجوز خروجی SELinux نقش proxy از شب ۲۲ لازم است.

بررسی عملیاتی#

از کلاینت پاسخ TLS بگیر، سرویس برنامه را restart و درخواست تازه را تکرار کن. journal برنامه و log Nginx دو شاهد جدا هستند. WSGI این مثال backend WebSocket نیست؛ مدل اجرای برنامه باید با پروتکل سازگار باشد.

بازگشت: ابتدا proxy را به backend سالم پیشین برگردان، سپس سرویس آزمایش را disable/stop کن. dependencyها را با نسخهٔ ثبت‌شده ارتقا بده و اعتبار هدرهای forwarded را در framework جدا تنظیم کن.

منبع: استقرار Gunicorn ، systemd.exec .