nginx ตั้งค่าตัวแปรในสถานที่


37

ฉันกำลังพยายามปรับการกำหนดค่า nginx ของฉันให้เหมาะสมดังนั้นจึงเป็นไปได้ที่จะตั้งค่าตัวแปรเดียวและเส้นทางตำแหน่งทั้งหมดจะอัปเดตโดยอัตโนมัติ ฉันมีคำถามสี่บรรทัด:

server_name php.domain.com;
root /srv/web/vhosts/php/web;
error_log /srv/web/vhosts/php/logs/error.log;
access_log /srv/web/vhosts/php/logs/access.log;

สิ่งที่ฉันต้องการบรรลุคือการตั้งค่าหนึ่งตัวแปร (ในกรณีนี้ 'php') และรวมถึงการกำหนดค่า

set $variable "php";
server_name $variable.domain.com;
root /srv/web/vhosts/$variable/web;
error_log /srv/web/vhosts/$variable/logs/error.log;
access_log /srv/web/vhosts/$variable/logs/access.log;

อย่างไรก็ตามมันเห็นว่า nginx ละเว้นตัวแปรในการกำหนดค่านี้ ฉันกำลังทำสิ่งผิดปกติหรือไม่สามารถใช้ตัวแปรในเส้นทางสถานที่ได้หรือไม่

คำตอบ:


58

ตัวแปรไม่สามารถประกาศได้ทุกที่และไม่สามารถใช้ในคำสั่งใด ๆ

ในฐานะที่เป็นเอกสารของsetคำสั่งคือ:

Syntax:   set $variable value;
Default:  —
Context:  server, location, if

ผลลัพธ์ที่ตามมาคือคุณไม่สามารถใช้ตัวแปรที่กำหนดเองในhttpบล็อกได้

อัปเดต : หลังจากการสนทนาและทดลองกับAlexeyTenในห้องสนทนานี้

  • access_logสามารถมีตัวแปรที่มีข้อ จำกัด ในหมู่พวกเขาขาดการบัฟเฟอร์และความจริงที่ว่าเฉือนชั้นนำจะต้องไม่ได้รับการประกาศในตัวแปร
  • error_log จะไม่ทำงานกับตัวแปรเลย
  • root คำสั่งสามารถมีตัวแปร
  • server_nameคำสั่งอนุญาตเฉพาะ$hostnameค่าที่เข้มงวดเป็นสัญกรณ์ที่เหมือนตัวแปร

1
access_log/ error_logทำงานกับตัวแปร แต่มีข้อ จำกัด server_nameไม่สามารถมีตัวแปร
Alexey Ten

@AlexeyTen อ่านคำตอบของฉันอีกครั้ง มันไม่ทำงานกับตัวแปรที่กำหนดเอง ชื่อเซิร์ฟเวอร์สามารถมีในตัว$hostnameตัวแปรเช่น อัปเดตคำตอบเพื่อชี้แจงพฤติกรรมที่
ซาเวียร์ลูคัส

5
ดี$hostnameเป็นตัวแปรที่ได้รับอนุญาตเท่านั้น github.com/nginx/nginx/blob/…ที่จริงแล้วมันเหมือนเวทมนตร์คงที่ไม่ใช่ตัวแปรที่แท้จริง
Alexey Ten

1
ขอให้เรายังคงอภิปรายนี้ในการแชท
Alexey Ten

3
นี่อาจเป็นคำตอบ SF ที่ดีที่สุดที่เคยมีการวิจัย ขอบคุณทั้งคุณ / Cc @AlexeyTen
kaiser
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.