Score:0

Django / Gunicorn พร้อมพร็อกซีย้อนกลับของ Nginx - การเปลี่ยนเส้นทางไปยังเส้นทางฐานไม่ถูกต้อง

ธง in

ฉันมีแอป Django ที่ทำงานกับ Gunicorn/Uvicorn ได้สำเร็จ ภายใต้พาธย่อยของโดเมนของฉัน (example.com/myapp)

Nginx vhost มีลักษณะดังนี้:

เซิร์ฟเวอร์ {

    server_name example.com;

    ตำแหน่ง /myapp/ {
        proxy_pass http://myapp_gunicorn/;
        proxy_set_header โฮสต์ $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    ตำแหน่ง /myapp/static/ {
        นามแฝง /home/www/myapp/static/;
    }

    ฟัง 443 ssl; # จัดการโดย Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # จัดการโดย Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # จัดการโดย Certbot
    รวม /etc/letsencrypt/options-ssl-nginx.conf; # จัดการโดย Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # จัดการโดย Certbot

}

ต้นน้ำ myapp_gunicorn {
    เซิร์ฟเวอร์ 127.0.0.1:8002;
}

เซิร์ฟเวอร์ {
    ถ้า ($host = example.com) {
        ส่งคืน 301 https://$host$request_uri;
    } # จัดการโดย Certbot
    server_name example.com;
    ฟัง 80;
    กลับ 404; # จัดการโดย Certbot
}

นี่คือบริการ systemd พร้อมคำสั่ง start ของ Gunicorn:

[หน่วย]
คำอธิบาย=myapp gunicorn daemon
หลังจาก = network.target

[บริการ]
ผู้ใช้ = www-ข้อมูล
Group=www-ข้อมูล
WorkingDirectory=/home/www/myapp
ExecStart=/home/venvs/myapp/bin/gunicorn myapp.asgi:application -b 0.0.0.0:8002 -w 8 -k uvicorn.workers.UvicornWorker --log-file /home/www/myapp.log

[ติดตั้ง]
WantedBy=multi-user.target

กำลังอ่านอยู่ ดังนั้นเกี่ยวกับ Django ในโฟลเดอร์ย่อยด้วย Nginxฉันได้เพิ่มการตั้งค่าต่อไปนี้ใน Django settings.py ของฉันแล้ว:

FORCE_SCRIPT_NAME = '/myapp'
USE_X_FORWARDED_HOST = จริง
# เพื่อให้ Django เชื่อถือ https จากพร็อกซี Nginx
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

ฉันสามารถเข้าถึงแอปและเส้นทางย่อยของแอปได้สำเร็จ https://example.com/myapp/endpoint และหน้าผู้ดูแลระบบ Django https://example.com/myapp/admin (เขียนใหม่สำเร็จเป็น https://example.com/myapp/admin/login/?next=/admin/) ตัวอย่างเช่น.

อย่างไรก็ตาม เมื่อคลิกที่ปุ่มยืนยันหน้าผู้ดูแลระบบ Django ฉันถูกเปลี่ยนเส้นทางไปยังเส้นทางฐานอย่างไม่ถูกต้อง (https://example.com/admin/login/?next=/admin/). นอกจากนี้ ฉันยังได้รับ 404 สำหรับไฟล์สแตติกทั้งหมด พวกมันยังให้บริการภายใต้พาธพื้นฐานอีกด้วย https://example.com/static/xxx แทนเส้นทางย่อย https://example.com/myapp/static/xxxแม้ว่าฉันคิดว่ามีการตั้งค่าอย่างถูกต้องใน vhost

ฉันได้ดูปัญหาที่คล้ายกันใน SO (รวมถึง อันนี้คล้ายกันมาก) แต่ก็ไม่ได้ช่วยอะไรฉันเลย

ความคิดใด ๆ

Michael Hampton avatar
cz flag
คุณได้บอกแอปของคุณหรือไม่ว่าเส้นทางฐานคืออะไร
in flag
ในการตั้งค่า Django ฉันตั้งค่าคงที่ BASE_DIR: `BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))` ซึ่งเป็นเส้นทาง bas ของระบบของแอป โดยฉันไม่แน่ใจว่านั่นคือสิ่งที่คุณหมายถึง?
Michael Hampton avatar
cz flag
แต่คุณบอกที่ไหนว่าฐานของเส้นทางทั้งหมดของคุณคือ `/myapp`?
in flag
ไม่มีที่ไหนเลย แต่ฉันคิดว่า Django กำลังจัดการมันด้วยตัวเอง ในพื้นที่ทำงานได้ดี ฉันควรกำหนดเส้นทางพื้นฐานหรือไม่ ยังไง?
in flag
จากที่ฉันเข้าใจ การตั้งค่า FORCE_SCRIPT_NAME ควรจะเติมเต็มบทบาทนี้ในกรณีที่แม่นยำนี้ ดูเหมือนปัญหา (ยังไม่ได้รับการแก้ไข) มาก: https://stackoverflow.com/questions/19103470/django-admin-force-script-name-login-redirects-incorrectly
in flag
FYI ฉันยอมแพ้ ไม่พบวิธีแก้ปัญหาและดูเหมือนว่าไม่มีตาม https://stackoverflow.com/questions/19103470/django-admin-force-script-name-login-redirects-incorrectly ดังนั้นฉันจึงสร้าง vhosts และ subdomains ที่แตกต่างกันสำหรับแต่ละแอป Python ของฉัน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา