آپاچی؛ شب ۳۰: اجرای پایدار برنامه پشت Apache با systemd
فهرست نوشته
ترمینال باز راه نگهداری سرویس نیست. امشب یک برنامهٔ WSGI را با حساب مستقل و Gunicorn زیر systemd اجرا میکنیم و Apache را به ورودی HTTPS آن تبدیل میکنیم.
این جلسه بخشی از دورهٔ آپاچی در ۵۰ شب است. قرارداد نامها، مسیرها و روش اعمال تغییر را در راهنمای دوره بخوان.
محیط: Python مطابق متغیر LAB_PYTHON، pip/venv آماده و app با proxy_http؛ نمونهٔ پورت 8088 از backendهای قبلی مستقل است.
حساب و کد برنامه#
WSGI قرارداد ارتباط وبسرور پایتونی با برنامه است؛ این نمونه WebSocket سرو نمیکند. در VM اختصاصی:
sudo useradd --system --home-dir /opt/apache-lab-app --shell /usr/sbin/nologin labapp
sudo install -d -o root -g labapp -m 750 /opt/apache-lab-app
sudo "$LAB_PYTHON" -m venv /opt/apache-lab-app/venv
sudo /opt/apache-lab-app/venv/bin/python -m pip install gunicorn
فایل root-owned به نام /opt/apache-lab-app/app.py با حالت 644:
def application(environ, start_response):
body = b"apache lab app OK\n"
start_response("200 OK", [("Content-Type", "text/plain"),
("Content-Length", str(len(body)))])
return [body]
فایل /etc/systemd/system/apache-lab-app.service:
[Unit]
Description=Apache lab application
After=network.target
[Service]
User=labapp
Group=labapp
WorkingDirectory=/opt/apache-lab-app
ExecStart=/opt/apache-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
sudo systemd-analyze verify /etc/systemd/system/apache-lab-app.service
sudo systemctl daemon-reload
sudo systemctl enable --now apache-lab-app
curl http://127.0.0.1:8088/
در APP_CONF نگاشت ریشه را به http://127.0.0.1:8088/ تغییر بده؛ مسیرهای ws و events اگر فعالاند، همچنان جلوتر میمانند. تنظیم هدرهای قابل اعتماد در framework باید با توپولوژی Apache سازگار باشد؛ قبول هر X-Forwarded-For مجاز نیست.
آزمون بهرهبرداری#
از کلاینت پاسخ HTTPS را بگیر، سرویس برنامه را restart کن و درخواست تازه بفرست. journalctl -u apache-lab-app و لاگ app Apache دو شاهد جدا هستند. برای نسخههای وابستگی، freeze ثبت کن و پیش از ارتقا در Clone آزمون بگیر.
بازگشت: proxy را به backend سالم قبلی برگردان و سپس سرویس آزمایش را با disable --now متوقف کن. program، TLS و restart policy باید هرکدام جدا بررسی شوند.
منبع: استقرار Gunicorn ، گزینههای sandbox در systemd.exec .