التطبيق · فصل ٣

البلوكين في ملف واحد

sites-available · listen 80 · return 301 · listen 443 ssl · proxy_pass
🎯 الهدف: تكتب بلوك التحويل وبلوك HTTPS في نفس الملف، وتعرف إن الاتنين مطلوبين.

على Ubuntu ملف الموقع هنا:

/etc/nginx/sites-available/example.com

غيّر example.com باسم الدومين. الاتنين اللي تحت مش اختيار. الاتنين يتكتبوا في نفس الملف.

/etc/nginx/sites-available/example.com
server {    listen 80;    listen [::]:80;    server_name example.com www.example.com;    return 301 https://$host$request_uri;}server {    listen 443 ssl;    listen [::]:443 ssl;    server_name example.com www.example.com;    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;    location / {        proxy_pass http://127.0.0.1:7000;        proxy_http_version 1.1;        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header X-Forwarded-Proto $scheme;    }}

بلوك 80

أي طلب على HTTP يرجع 301 لنفس الرابط على HTTPS.

مثال: http://example.com/users?page=2 يبقى https://example.com/users?page=2.

$host اسم الموقع. $request_uri المسار والاستعلام. التحويل ما يضيّعش الصفحة.

بلوك 80 ما فيهوش proxy_pass. شغله تحويل بس.

بلوك 443

هنا الشهادة. وهنا التسليم للتطبيق.

  • listen 443 ssl يعني HTTPS على البورت ده. كلمة ssl على سطر listen. متكتبش ssl on. الأمر ده اتشال.
  • مسار الشهادة في المثال من Let’s Encrypt. لو المسار عندك مختلف، حط المسار الصح. الملف مش هيشتغل من غير الشهادتين على القرص.
  • proxy_pass http://127.0.0.1:7000 يسلّم جوّه الجهاز. التطبيق في المثال Express على 7000. لو بورت التطبيق مختلف، غيّر الرقم.
  • الهيدرز تخلي التطبيق يعرف الدومين الأصلي، وإن الطلب كان HTTPS.

سطر [::]:80 مع سطر [::]:443 لنسخة IPv6. لو الجهاز من غيرها، السطرين دول مش هيضرّوا على إعداد Ubuntu العادي.

خلّصت الفصل لما

🧠 اختبر نفسك
١) أكتب بلوك 80 ولا بلوك 443؟
الاتنين. في نفس الملف.
٢) ليه بلوك 80 من غير proxy_pass؟
لأنه ما يسلّمش للتطبيق. بيرجع عنوان HTTPS وبس.
٣) proxy_pass على 127.0.0.1:7000 يعني إيه؟
Nginx يكلّم التطبيق من جوّه الجهاز، مش من الإنترنت.