انجیناکس؛ شب ۲۸: برنامهٔ پایدار با systemd پشت Nginx
فهرست نوشته
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 .