TLDR: Nginx ให้ความสำคัญกับโดเมนย่อยตามลำดับตัวอักษรของไฟล์กำหนดค่า และฉันต้องการทราบวิธีป้องกันไม่ให้สิ่งนี้เกิดขึ้น นี่คือ คล้ายกัน ถึง นี้ คำถาม แต่ฉันสนใจที่จะปรับปรุงระบบของฉันมากกว่า
ฉัน (มี) สองส่วนบนเซิร์ฟเวอร์ของฉัน: ส่วนหนึ่งสำหรับเว็บไซต์แบบสแตติก และอีกส่วนหนึ่งสำหรับอินสแตนซ์ dokuwiki ของฉัน ฉันต้องการให้โหลด dokuwiki เมื่อมีคนไปที่ example.com และเว็บไซต์แบบคงที่โหลดเมื่อมีคนไปที่ static.example.com สุดท้ายนี้ ฉันต้องการให้ wiki.example.com ชี้ไปที่ dokuwiki เสมอ ในกรณีที่ค่าดีฟอลต์เปลี่ยนไป
เพื่อให้บรรลุสิ่งนี้ ฉันมีไฟล์สองไฟล์ใน /etc/nginx/sites-available
โดกุวิกิ (นี่เป็นเพียงการกำหนดค่า dokuwiki ทั่วไปที่มี certbot ทำงานอยู่)
เซิร์ฟเวอร์ {
ถ้า ($host = www.example.com) {
ส่งคืน 301 https://$host$request_uri;
} # จัดการโดย Certbot
ถ้า ($host = example.com) {
ส่งคืน 301 https://$host$request_uri;
} # จัดการโดย Certbot
ถ้า ($host = wiki.example.com) {
ส่งคืน 301 https://$host$request_uri;
} # จัดการโดย Certbot
ฟัง 80;
ฟัง [::]:80;
server_name wiki.example.com example.com www.example.com;
ส่งคืน 301 https://$server_name$request_uri;
}
เซิร์ฟเวอร์ {
ฟัง [::]:443 ssl;
ฟัง 443 ssl;
server_name example.com www.example.com wiki.example.com;
# ขนาดไฟล์อัพโหลดสูงสุดคือ 4MB - เปลี่ยนตามความจำเป็น
client_max_body_size 4M;
client_body_buffer_size 128k;
ราก /dokuwiki/dokuwiki-2020-07-29;
ดัชนี doku.php;
#อย่าลืมแสดงความคิดเห็นด้านล่างเมื่อคุณกำลังติดตั้งและยกเลิกการแสดงความคิดเห็นเมื่อเสร็จสิ้น
ตำแหน่ง ~ /(conf/|bin/|inc/|install.php) { ปฏิเสธทั้งหมด; }
#Support สำหรับ X-Accel-เปลี่ยนเส้นทาง
ตำแหน่ง ~ ^/data/ { ภายใน ; }
ตำแหน่ง ~ ^/lib.*\.(js|css|gif|png|ico|jpg|jpeg)$ {
หมดอายุ 365d;
}
ตำแหน่ง / { try_files $uri $uri/ @dokuwiki; }
ที่ตั้ง @dokuwiki {
# เขียนซ้ำ "doku.php/" จาก URL หากคุณตั้งค่า userwrite เป็น .htaccess ในหน้ากำหนดค่า dokuwiki
เขียนใหม่ ^/_media/(.*) /lib/exe/fetch.php?media=$1 ล่าสุด;
เขียนใหม่ ^/_detail/(.*) /lib/exe/detail.php?media=$1 ล่าสุด;
เขียนใหม่ ^/_export/([^/]+)/(.*) /doku.php?do=export_$1&id=$2 สุดท้าย;
เขียนใหม่ ^/(.*) /doku.php?id=$1&$args สุดท้าย;
}
ตำแหน่ง ~ \.php$ {
try_files $uri $uri/ /doku.php;
รวม fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param REDIRECT_STATUS 200;
fastcgi_pass ยูนิกซ์:/var/run/php/php7.3-fpm.sock;
# fastcgi_pass ยูนิกซ์:/var/run/php5-fpm.sock; #php เวอร์ชั่นเก่า
}
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # จัดการโดย Certbot
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # จัดการโดย Certbot
}
คงที่
เซิร์ฟเวอร์ {
รูท /var/www/example;
ดัชนี index.html index.htm index.nginx-debian.html;
server_name static.example.com;
ที่ตั้ง / {
try_files $uri $uri/ =404;
}
ฟัง [::]:443 ssl ipv6only=เปิด; # จัดการโดย Certbot
ฟัง 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
}
ระบบนี้ทำงานได้ตรงตามที่ฉันคาดไว้ อย่างไรก็ตาม ฉันได้เพิ่ม commafeed ลงในเซิร์ฟเวอร์ของฉันแล้ว เป้าหมายของฉันคือการเข้าถึง commafeed ผ่าน rss.example.com Commafeed ทำงานบนพอร์ต 8082 ดังนั้นฉันจึงทำ proxy_pass ไปยัง example.com/8082 ในไฟล์นี้
คอมมาฟีด
เซิร์ฟเวอร์ {
ฟัง 443;
ฟัง [::]:443;
รูท /var/www/commafeed;
ดัชนี index.html index.htm index.nginx-debian.html;
ชื่อเซิร์ฟเวอร์ rss.example.com www.rss.example.com;
ที่ตั้ง / {
proxy_pass http://example.com:8082/;
ปิด proxy_buffering;
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;
}
}
เมื่อฉันทำสิ่งนี้ ฉันได้รับการรีเซ็ตการเชื่อมต่อบนเบราว์เซอร์ของฉันสำหรับ ทั้งหมด โดเมน example.com และบันทึกข้อความแสดงข้อผิดพลาดนี้
ตัวอย่าง:/etc/nginx/sites-available# tail -f /var/log/nginx/error.log -n 0
28/09/2021 03:10:36 [ข้อผิดพลาด] 32479#32479: *2317 ไม่มีการกำหนด "ssl_certificate" ในเซิร์ฟเวอร์ที่ฟังพอร์ต SSL ขณะจับมือ SSL ลูกค้า: <ที่อยู่ ipv6 ของฉัน> เซิร์ฟเวอร์: [::]: 443
28/09/2021 03:10:36 [ข้อผิดพลาด] 32479#32479: *2318 ไม่มีการกำหนด "ssl_certificate" ในเซิร์ฟเวอร์ที่ฟังพอร์ต SSL ขณะจับมือ SSL ลูกค้า: <ที่อยู่ ipv6 ของฉัน> เซิร์ฟเวอร์: [::]: 443
อย่างไรก็ตาม เมื่อฉันเปลี่ยนชื่อไฟล์เป็น "zcommafeed" ทุกอย่างก็ทำงานได้ตามที่ตั้งใจไว้ นั่นคือ โดเมนย่อยเก่าทั้งหมดทำงานเหมือนที่เคยทำมา เช่นเดียวกับ rss.example.com ที่ชี้ไปที่ commafeed
ขณะนี้ การทำงานนี้ดูเหมือนจะบอกเป็นนัยว่ามีวิธีที่ดีกว่าในการทำเช่นนี้ซึ่งไม่เกี่ยวข้องกับการใส่ใจกับลำดับตัวอักษรของไฟล์ ฉันยังใหม่กับ NGINX ดังนั้นฉันจึงยินดีเป็นอย่างยิ่งสำหรับความช่วยเหลือ!!