
บทความ ที่น่าสนใจ
การกำหนดค่า NGINX: การทำความเข้าใจคำสั่ง !!!
การกำหนดค่า NGINX: การทำความเข้าใจคำสั่ง
ไฟล์กำหนดค่า NGINX ทุกไฟล์จะอยู่ในไดเร็กทอรี /etc/nginx/ โดยที่ไฟล์กำหนดค่าหลักจะอยู่ใน/etc/nginx/nginx.conf
ตัวเลือกการกำหนดค่า NGINX เรียกว่า “คำสั่ง” โดยจะถูกจัดเรียงเป็นกลุ่ม ซึ่งเรียกแทนกันได้ว่าบล็อกหรือบริบท
เมื่อ # ปรากฏก่อนบรรทัด สิ่งเหล่านี้คือความคิดเห็นและ NGINX จะไม่ตีความสิ่งเหล่านี้ บรรทัดที่มีคำสั่งควรลงท้ายด้วยเครื่องหมายเซมิโคลอน (;) หากไม่เป็นเช่นนั้น NGINX จะไม่สามารถโหลดการกำหนดค่าได้อย่างถูกต้องและรายงานข้อผิดพลาด
ด้านล่างนี้ เราได้รวมไฟล์ /etc/nginx/nginx.conf แบบย่อที่รวมอยู่ในการติดตั้งจากที่เก็บ NGINX ไฟล์นี้เริ่มต้นด้วยคำสั่งสี่คำสั่ง:
- ผู้ใช้
- กระบวนการทำงาน
- บันทึกข้อผิดพลาด
- พีด
สิ่งเหล่านี้มีอยู่ภายนอกบริบทหรือบล็อกใดๆ และกล่าวว่าอยู่ภายในบริบทหลัก
คำสั่งเพิ่มเติมพบได้ภายในเหตุการณ์และ บล็อค httpนอกจากนี้ยังมีอยู่ในบริบทหลัก ด้วย
ไฟล์: /etc/nginx/nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
. . .
}
http {
. . .
}
HTTP Block คืออะไร?
บล็อกhttpประกอบด้วยคำสั่งสำหรับการจัดการปริมาณการรับส่งข้อมูลบนเว็บ ซึ่งโดยทั่วไปเรียกว่าคำสั่งสากลเนื่องจากคำสั่งเหล่านี้จะถูกส่งต่อไปยังการกำหนดค่าเว็บไซต์แต่ละรายการที่ให้บริการโดย NGINX
ไฟล์: /etc/nginx/nginx.conf
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
Server Blocks คืออะไร?
บล็อกhttpที่แสดงด้านบนมี คำสั่ง includeซึ่งจะแจ้งให้ NGINX ทราบว่าไฟล์กำหนดค่าเว็บไซต์อยู่ที่ใด
เมื่อทำการติดตั้งจากคลังข้อมูลอย่างเป็นทางการของ NGINX บรรทัดดังกล่าวจะแสดงเป็น include /etc/nginx/conf.d/*.conf ซึ่งคุณจะเห็นได้จาก บล็อก httpที่วางอยู่ด้านบน เว็บไซต์ทุกแห่งที่โฮสต์ด้วย NGINX ควรมีไฟล์กำหนดค่าเฉพาะใน /etc/nginx/conf.d/ และชื่อจะจัดรูปแบบเป็น example.com.conf เว็บไซต์ที่ถูกปิดใช้งาน — ไม่ได้รับบริการจาก NGINX — ควรมีชื่อว่า example.com.conf.disabled
เมื่อติดตั้ง NGINX จากคลังข้อมูลของ Ubuntu หรือ Debian บรรทัดดังกล่าวจะแสดงว่า include /etc/nginx/sites-enabled/*; โฟลเดอร์ ../sites-enabled/ จะรวมลิงก์สัญลักษณ์ไปยังไฟล์การกำหนดค่าไซต์ที่อยู่ใน /etc/nginx/sites-available/ คุณสามารถปิดใช้งานไซต์ภายใน sites-available ได้หากคุณลบลิงก์สัญลักษณ์ไปยัง sites-enabled
ตามแหล่งที่มาของการติดตั้ง สามารถพบไฟล์การกำหนดค่าประกอบได้ที่ /etc/nginx/conf.d/default.conf หรือ etc/nginx/sites-enabled/default
ไม่ว่าแหล่งที่มาของการติดตั้งจะเป็นแบบใด ไฟล์การกำหนดค่าเซิร์ฟเวอร์จะมีบล็อกเซิร์ฟเวอร์อย่างน้อยหนึ่งบล็อกสำหรับไซต์หนึ่งๆ ตัวอย่างเช่น ลองดูด้านล่าง:
ไฟล์: /etc/nginx/conf.d/example.com.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
try_files $uri /index.html;
}
พอร์ตการฟังคืออะไร?
คำสั่ง listen จะแจ้งให้ NGINX ทราบเกี่ยวกับชื่อโฮสต์/IP และ พอร์ต TCPจึงจดจำได้ว่าจะต้องฟังที่ใดสำหรับการเชื่อมต่อ HTTP
อาร์กิวเมนต์ default_server หมายความว่าโฮสต์เสมือนนี้จะตอบรับคำขอบนพอร์ต 80 ซึ่งไม่ตรงกับคำสั่ง listen ของโฮสต์เสมือนแยกต่างหาก เมื่อถึงคำสั่งที่สอง คำสั่งนี้จะรับฟังผ่านIPv6และแสดงพฤติกรรมที่คล้ายคลึงกัน
การโฮสต์เสมือนตามชื่อคืออะไร?
คำสั่ง server_name ช่วยให้สามารถให้บริการโดเมนจำนวนหนึ่งได้จากที่อยู่ IP เพียงที่อยู่เดียว และเซิร์ฟเวอร์จะกำหนดว่าจะให้บริการโดเมนใดตามส่วนหัวคำขอที่ได้รับ
โดยทั่วไป คุณควรสร้างไฟล์หนึ่งไฟล์สำหรับแต่ละไซต์หรือโดเมนที่คุณต้องการโฮสต์บนเซิร์ฟเวอร์ของคุณ มาดูตัวอย่างบางส่วนกัน:
ประมวลผลคำขอสำหรับ example.com และ www.example.com:
ไดเรกทิฟ server_name สามารถใช้ไวด์การ์ดได้ *.example.com และ .example.com แจ้งให้เซิร์ฟเวอร์ประมวลผลคำขอสำหรับโดเมนย่อย example.com ทั้งหมด:
ไฟล์: /etc/nginx/conf.d/example.com.conf
server_name *.example.com;
server_name .example.com;
ประมวลผลคำขอสำหรับชื่อโดเมนทั้งหมดเริ่มต้นด้วยตัวอย่าง:
ไฟล์: /etc/nginx/conf.d/example.com.conf
server_name example.*;
ด้วย NGINX คุณสามารถกำหนดชื่อเซิร์ฟเวอร์ที่เป็นชื่อโดเมนที่ไม่ถูกต้องได้ โดยจะใช้ชื่อจากส่วนหัว HTTP เพื่อตอบสนองคำขอโดยไม่คำนึงว่าชื่อโดเมนนั้นถูกต้องหรือไม่ถูกต้องก็ตาม
คุณอาจพบว่าชื่อโฮสต์ที่ไม่ใช่โดเมนมีประโยชน์หากเซิร์ฟเวอร์ของคุณอยู่บน LAN หรือคุณรู้จักไคลเอนต์ทั้งหมดที่น่าจะส่งคำขอบนเซิร์ฟเวอร์ ซึ่งรวมถึงเซิร์ฟเวอร์พร็อกซีส่วนหน้าที่มีรายการ /etc/hosts ที่ตั้งค่าไว้สำหรับที่อยู่ IP ที่ NGINX กำลังรับฟังอยู่
Location Blocks คืออะไร?
การตั้งค่าตำแหน่งของ NGINX ช่วยให้คุณตั้งค่าวิธีที่ NGINX ตอบสนองต่อคำขอทรัพยากรภายในเซิร์ฟเวอร์ เนื่องจากคำสั่ง server_name แจ้งให้ NGINX ทราบว่าควรประมวลผลคำขอสำหรับโดเมนอย่างไร คำสั่ง location จึงใช้กับคำขอสำหรับโฟลเดอร์และไฟล์บางไฟล์ (เช่น http://example.com/blog/.)
มาพิจารณาตัวอย่างสักสองสามตัวอย่าง:
ไฟล์: /etc/nginx/sites-available/example.com
location / { }
location /images/ { }
location /blog/ { }
location /planet/ { }
location /planet/blog/ { }
ตำแหน่งเหล่านี้เป็นการจับคู่สตริงตามตัวอักษรและตรงกับส่วนใดก็ได้ของคำขอ HTTP ที่ตามหลังเซกเมนต์โฮสต์:
คำขอ: http://example.com/
ผลลัพธ์:สมมติว่ามีรายการ server_name สำหรับ example.com ในกรณีนี้ ตำแหน่ง/ไดเรกทิฟจะกำหนดว่าจะเกิดอะไรขึ้นกับคำขอนี้
ด้วย NGINX คำขอต่างๆ จะได้รับการตอบสนองด้วยการจับคู่ที่เฉพาะเจาะจงที่สุดเสมอ:
คำขอ: http://example.com/planet/blog หรือ http://example.com/planet/blog/about/
การส่งคืน:สิ่งนี้จะได้รับการเติมเต็มโดยตำแหน่งที่ตั้ง /planet/blog เนื่องจากมีความเฉพาะเจาะจงมากกว่า แม้ว่าตำแหน่งที่ตั้ง /planet จะตรงกันก็ตาม
ไฟล์: /etc/nginx/sites-available/example.com
location ~ IndexPage.php$ { }
location ~ ^/BlogPlanet(/|/index.php)$ { }
เมื่อคำสั่งตำแหน่งตามด้วย ~ (ทิลดา) NGINX จะดำเนินการจับคู่นิพจน์ปกติ ซึ่งจะคำนึงถึงตัวพิมพ์เล็ก/ใหญ่เสมอ
ตัวอย่างเช่น IndexPage.php จะตรงกับตัวอย่างแรกข้างต้น ในขณะที่ indexpage.php จะไม่ตรงกัน
ในตัวอย่างที่สอง นิพจน์ทั่วไป ^/BlogPlanet(/|/index.php)$ { } จะจับคู่คำขอสำหรับ /BlogPlanet/ และ /BlogPlanet/index.php แต่ไม่จับคู่กับ /BlogPlanet, /blogplanet/ หรือ /blogplanet/index.php NGINX ใช้ Perl Compatible Regular Expressions (PCRE)
จะเป็นอย่างไรหากคุณต้องการให้การจับคู่ไม่คำนึงถึงตัวพิมพ์เล็ก-ใหญ่ คุณควรใช้เครื่องหมายติลเดอตามด้วยเครื่องหมายดอกจัน: ~* คุณจะเห็นตัวอย่างด้านบนซึ่งระบุว่า NGINX ควรประมวลผลคำขอที่ลงท้ายด้วยนามสกุลไฟล์บางนามสกุล ตัวอย่างแรกระบุว่าไฟล์ที่ลงท้ายด้วย .pl, PL, .cgi, .perl, .Perl, .prl และ .PrL (รวมถึงไฟล์อื่นๆ) จะตรงกับคำขอทั้งหมด
ไฟล์: /etc/nginx/sites-available/example.com
location ^~ /images/IndexPage/ { }
location ^~ /blog/BlogPlanet/ { }
เมื่อคุณเพิ่มเครื่องหมายแคเรตและเครื่องหมายทิลเดอ (^~) ลงในคำสั่งระบุตำแหน่ง คุณกำลังแจ้ง NGINX ว่า หากตรงกับสตริงตัวใดตัวหนึ่ง ระบบจะหยุดค้นหารายการที่ตรงกันเจาะจงมากขึ้น และใช้คำสั่งเหล่านี้แทน
นอกจากนี้ คำสั่งเหล่านี้ยังทำงานในลักษณะเดียวกับการจับคู่สตริงตามตัวอักษรในกลุ่มแรก แม้ว่าจะมีการจับคู่ที่เฉพาะเจาะจงมากขึ้นในภายหลัง การตั้งค่าต่างๆ จะถูกใช้หากคำขอตรงกับคำสั่งเหล่านี้
ตอนนี้มาดูรายละเอียดเพิ่มเติมเกี่ยวกับการประมวลผลการกำหนดตำแหน่งกัน
ไฟล์: /etc/nginx/sites-available/example.com
location = / { }
สุดท้ายการเพิ่มสัญลักษณ์เท่ากับลงในการตั้งค่าตำแหน่งจะทำให้ต้องตรงกับเส้นทางที่ร้องขอและจบลงด้วยการค้นหารายการที่ตรงกันที่เฉพาะเจาะจงมากขึ้น
ตัวอย่างเช่น ตัวอย่างสุดท้ายจะเป็นการจับคู่กับ http://example.com เท่านั้น ตรงกันข้ามกับ http://example.com/index.html หากคุณใช้การจับคู่แบบตรงเป๊ะ คุณสามารถเพิ่มความเร็วของเวลาคำขอได้ในระดับปานกลาง ซึ่งอาจเป็นประโยชน์หากมีคำขอบางรายการเกิดขึ้นบ่อยครั้ง
การประมวลผลคำสั่งจะดำเนินไปตามลำดับนี้:
การจับคู่สตริงที่แน่นอนจะถูกประมวลผลก่อน: NGINX จะหยุดการค้นหาหากพบการจับคู่และจะตอบสนองคำขอ
คำสั่งสตริงตัวอักษรที่เหลือทั้งหมดจะถูกประมวลผลในขั้นถัดไป NGINX จะหยุดและดำเนินการตามคำขอหากพบการจับคู่โดยใช้ตัวแปร ^~ หากไม่เป็นเช่นนั้น NGINX จะดำเนินการประมวลผลคำสั่งระบุตำแหน่งต่อไป
ขั้นตอนต่อไปคือการประมวลผลคำสั่งระบุตำแหน่งแต่ละคำสั่งที่มีนิพจน์ทั่วไป (~ และ ~*) หากนิพจน์ทั่วไปตรงกับคำขอ NGINX จะยุติการค้นหาและดำเนินการตามคำขอ
สุดท้ายนี้ หากไม่มีนิพจน์ทั่วไปที่ตรงกัน ระบบจะใช้การจับคู่สตริงตามตัวอักษรที่เฉพาะเจาะจงที่สุด
ตรวจสอบให้แน่ใจว่าไฟล์และโฟลเดอร์ทั้งหมดที่พบภายใต้โดเมนตรงกับคำสั่งตำแหน่งที่ตั้งหนึ่งรายการขึ้นไป
ไม่แนะนำหรือรองรับการบล็อกตำแหน่งแบบซ้อนกัน
วิธีการใช้ตำแหน่งรูทและดัชนี
การตั้งค่าตำแหน่งเป็นตัวแปรอีกตัวซึ่งมีบล็อกอาร์กิวเมนต์ของตัวเอง
เมื่อ NGINX ระบุตำแหน่งไดเรกทิฟที่ตรงกับคำขอเฉพาะมากที่สุด การตอบสนองจะขึ้นอยู่กับเนื้อหาของบล็อกไดเรกทิฟตำแหน่งที่เกี่ยวข้อง ตัวอย่างเช่น:
ไฟล์: /etc/nginx/sites-available/example.com
location / {
root html;
index index.html index.htm;
}
จากตัวอย่างนี้ เราจะเห็นว่ารูทของเอกสารนั้นอยู่ในไดเร็กทอรี html/ ภายใต้คำนำหน้าการติดตั้งเริ่มต้นของ NGINX เส้นทางเต็มของตำแหน่งนั้นคือ /etc/nginx/html/
คำขอ: http://example.com/blog/includes/style.css
ส่งคืน: NGINX จะพยายามให้บริการไฟล์ที่พบใน /etc/nginx/html/blog/includes/style.css
หมายเหตุ:
คุณสามารถใช้เส้นทางสัมบูรณ์สำหรับไดเรกทิฟรูทได้หากต้องการ ตัวแปรดัชนีจะแจ้งให้ NGINX ทราบว่าควรให้บริการไฟล์ใดหากไม่มีการระบุ
ดังนั้นตัวอย่างเช่น:
คำขอ: http://example.com
ผลลัพธ์: NGINX จะพยายามให้บริการไฟล์ที่พบใน /etc/nginx/html/index.html
เมื่อระบุจำนวนไฟล์สำหรับคำสั่ง index รายการจะถูกประมวลผลตามลำดับ และ NGINX จะตอบสนองคำขอด้วยไฟล์แรกที่พบว่ามีอยู่แล้ว หากไม่พบไฟล์ index.html ในไดเรกทอรีที่เกี่ยวข้อง จะใช้ไฟล์ index.htm แทน หากไม่พบไฟล์ทั้งสองไฟล์ ระบบจะส่งข้อความ 404
มาพิจารณาตัวอย่างที่ซับซ้อนกว่าซึ่งแสดงคำสั่งตำแหน่งหลายรายการสำหรับเซิร์ฟเวอร์ที่ตอบสนองต่อโดเมนตัวอย่าง:
ไฟล์: /etc/nginx/sites-available/example.com คำสั่งระบุตำแหน่ง
location / {
root /srv/www/example.com/public_html;
index index.html index.htm;
}
location ~ .pl$ {
gzip off;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_index index.pl;
fastcgi_param SCRIPT_FILENAME /srv/www/example.com/public_html$fastcgi_script_name;
}
ที่นี่ เราจะเห็นว่าบล็อกตำแหน่งที่สองจะจัดการคำขอทั้งหมดสำหรับทรัพยากรที่ลงท้ายด้วยนามสกุล .pl และจะระบุตัวจัดการ fastcgi สำหรับคำขอเหล่านั้น ในกรณีอื่น NGINX จะใช้คำสั่งตำแหน่งแรก
ทรัพยากรสามารถพบได้ในระบบไฟล์ที่ /srv/www/example.com/public_html/ เมื่อไม่มีการกำหนดชื่อไฟล์ที่แน่นอนในคำขอ NGINX จะค้นหาไฟล์ index.html หรือ index.htm และจัดเตรียมให้ หากพบไฟล์ดัชนีเป็นศูนย์ ระบบจะแสดงข้อความแสดงข้อผิดพลาด 404
มาพิจารณาสิ่งที่เกิดขึ้นระหว่างคำขอตัวอย่างจำนวนหนึ่ง:
คำขอ: http://example.com/
ผลลัพธ์: /srv/www/example.com/public_html/index.html หากมีอยู่ มิฉะนั้น จะแสดง /srv/www/example.com/public_html/index.htm และหากไม่มีทั้งสองรายการนี้ จะแสดงข้อผิดพลาด 404
คำขอ: http://example.com/blog/
ผลลัพธ์: /srv/www/example.com/public_html/blog/index.html หากมีอยู่ หากไม่พบไฟล์เนื่องจากไม่มีอยู่ ระบบจะแสดง /srv/www/example.com/public_html/blog/index.htm หากไม่มีไฟล์ใดอยู่เลย NGINX จะแสดงข้อผิดพลาด 404
คำขอ: http://example.com/tasks.pl
ส่งคืน: NGINX จะใช้ประโยชน์จากตัวจัดการ FastCGI เพื่อดำเนินการไฟล์ที่พบใน /srv/www/example.com/public_html/tasks.pl และส่งคืนผลลัพธ์ที่เกี่ยวข้อง
คำขอ: http://example.com/username/roster.pl
การส่งคืน: NGINX จะใช้ตัวจัดการ FastCGI เพื่อดำเนินการไฟล์ที่พบใน /srv/www/example.com/public_html/username/roster.pl และส่งคืนผลลัพธ์ที่เกี่ยวข้อง

บทความ ล่าสุด
บทความ ความรู้ด้านไอที, คอมพิวเตอร์ Techonlogy, Gadget, ความรู้เกี่ยวกับคอมพิวเตอร์ กับทาง SoftMelt.com