nginx: [ฉุกเฉิน] คำสั่ง "เซิร์ฟเวอร์" ไม่ได้รับอนุญาตที่นี่


113

ฉันได้กำหนดค่า nginx ใหม่แล้ว แต่ไม่สามารถเริ่มต้นใหม่ได้โดยใช้การกำหนดค่าต่อไปนี้:

conf:

server {
listen 80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}


server {
listen 80;
server_name example.com;

access_log /var/log/nginx/access.log;
error_log  /var/log/nginx/error.log;

location /robots.txt {
    alias /path/to/robots.txt;
    access_log off;
    log_not_found off;
}

location = /favicon.ico { access_log off; log_not_found off; }

location / {
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_connect_timeout 30;
    proxy_read_timeout 30;
    proxy_pass http://127.0.0.1:8000;
}

location /static {
    expires 1M;
    alias  /path/to/staticfiles;
}
}

หลังจากรันsudo nginx -c conf -tเพื่อทดสอบการกำหนดค่าข้อผิดพลาดต่อไปนี้จะถูกส่งกลับฉันไม่สามารถเข้าใจได้ว่าอะไรคือปัญหาจริงๆ

nginx: [emerg] "server" directive is not allowed here in    /etc/nginx/sites-available/config:1
nginx: configuration file /etc/nginx/sites-available/config test failed

คำตอบ:


198

นั่นไม่ใช่nginxไฟล์คอนฟิกูเรชัน เป็นส่วนหนึ่งของnginxไฟล์กำหนดค่า

nginxแฟ้มการกำหนดค่า (โดยปกติจะเรียกว่าnginx.conf) จะมีลักษณะเช่น:

events {
    ...
}
http {
    ...
    server {
        ...
    }
}

serverบล็อกถูกปิดล้อมอยู่ในhttpบล็อก

บ่อยครั้งที่การกำหนดค่าถูกกระจายไปยังไฟล์หลายไฟล์โดยใช้includeคำสั่งเพื่อดึงส่วนเพิ่มเติมเข้าsites-enabledมา

ใช้sudo nginx -tเพื่อทดสอบไฟล์คอนฟิกูเรชันที่สมบูรณ์ซึ่งเริ่มต้นที่nginx.confและดึงส่วนเพิ่มเติมโดยใช้includeคำสั่ง ดูเอกสารนี้สำหรับข้อมูลเพิ่มเติม


anwser นี้ถูกต้องและได้รับการโหวตอย่างถูกต้อง - ฉันพยายามชี้แจงเพิ่มเติมอาจช่วยคนอื่น ๆ เช่นฉันได้ ได้ตอบคำถามด้านล่างนี้แล้ว
Rohit Dhankar

15

ตัวอย่าง nginx.conf ที่ถูกต้องสำหรับ reverse proxy เผื่อมีใครติดเหมือนผม. ที่10.x.x.xเป็นเซิร์ฟเวอร์ที่คุณกำลังเรียกใช้พร็อกซี่ Nginx เซิร์ฟเวอร์และที่คุณกำลังเชื่อมต่อกับเบราว์เซอร์และ10.y.y.yเป็นที่ที่เว็บเซิร์ฟเวอร์ที่แท้จริงของคุณกำลังทำงาน

events {
  worker_connections  4096;  ## Default: 1024
}
http {
 server {
   listen 80;
   listen [::]:80;

   server_name 10.x.x.x;
 
   location / {
       proxy_pass http://10.y.y.y:80/;
       proxy_set_header Host $host;
   }
 }
}

นี่คือตัวอย่างข้อมูลหากคุณต้องการส่งผ่าน SSL นั่นคือถ้า10.y.y.yกำลังเรียกใช้เว็บเซิร์ฟเวอร์ HTTPS ที่นี่10.x.x.xหรือที่ที่ nignx รันกำลังฟังพอร์ต 443 และทราฟฟิกทั้งหมดไปยัง 443 จะถูกส่งไปยังเว็บเซิร์ฟเวอร์เป้าหมายของคุณ

events {
  worker_connections  4096;  ## Default: 1024
}

stream {
  server {
    listen     443;
    proxy_pass 10.y.y.y:443;
  }
}

และคุณสามารถเสิร์ฟในนักเทียบท่าได้ด้วย

 docker run --name nginx-container --rm --net=host   -v /home/core/nginx/nginx.conf:/etc/nginx/nginx.conf nginx

7

เส้นทางไปยังnginx.confไฟล์ซึ่งเป็นไฟล์การกำหนดค่าหลักสำหรับ Nginx - ซึ่งเป็นไฟล์ซึ่งจะรวมถึงเส้นทางสำหรับแฟ้ม Nginx Config อื่น ๆ /etc/nginx/nginx.confและเป็นการเมื่อจำเป็น

คุณสามารถเข้าถึงและแก้ไขไฟล์นี้ได้โดยพิมพ์ที่เทอร์มินัล

cd /etc/nginx

/etc/nginx$ sudo nano nginx.conf

นอกจากนี้ในไฟล์นี้คุณสามารถรวมไฟล์อื่น ๆ ซึ่งสามารถมีคำสั่ง SERVER เป็น SERVER BLOCK อิสระซึ่งไม่จำเป็นต้องอยู่ในบล็อก HTTP หรือ HTTPS ดังที่ได้อธิบายไว้ในคำตอบที่ยอมรับข้างต้น

ฉันขอย้ำ - ถ้าคุณต้องการให้กำหนด SERVER BLOCK ภายในไฟล์ PRIMARY Config เองมากกว่าที่ SERVER BLOCK จะต้องถูกกำหนดภายในบล็อก HTTP หรือ HTTPS ที่ล้อมรอบใน /etc/nginx/nginx.confไฟล์ซึ่งเป็นไฟล์ Configuration หลักสำหรับ Nginx

นอกจากนี้ยังทราบตกลง -its ถ้าคุณกำหนดบล็อก SERVER โดยตรงไม่ได้ปิดล้อมมันภายใน HTTP หรือ HTTPS /etc/nginx/conf.dบล็อกในแฟ้มที่ตั้งอยู่ในเส้นทาง นอกจากนี้ในการทำงานนี้คุณจะต้องรวมเส้นทางของไฟล์นี้ไว้ในไฟล์ PRIMARY Config ดังที่แสดงด้านล่าง: -

http{
    include /etc/nginx/conf.d/*.conf; #includes all files of file type.conf
}

นอกจากนี้คุณสามารถแสดงความคิดเห็นได้จากไฟล์การกำหนดค่าหลักบรรทัด

http{
    #include /etc/nginx/sites-available/some_file.conf; # Comment Out 
    include /etc/nginx/conf.d/*.conf; #includes all files of file type.conf
}

และไม่จำเป็นต้องเก็บไฟล์ Config ใด ๆ ไว้/etc/nginx/sites-available/และไม่จำเป็นต้อง SYMBOLIC Link ไปที่/etc/nginx/sites-enabled/โปรดทราบว่าสิ่งนี้ใช้ได้กับฉัน - ในกรณีที่ใครคิดว่ามันไม่เหมาะกับพวกเขาหรือการกำหนดค่าประเภทนี้ผิดกฎหมาย ฯลฯ โปรดแสดงความคิดเห็นเพื่อที่ ฉันจะแก้ไขตัวเองได้ - ขอบคุณ

แก้ไข: - ตามเวอร์ชันล่าสุดของ Nginx CookBook อย่างเป็นทางการเราไม่จำเป็นต้องสร้าง Configs ใด ๆ ภายใน - /etc/nginx/sites-enabled/นี่เป็นแนวทางปฏิบัติที่เก่ากว่าและเลิกใช้แล้วในขณะนี้

include /etc/nginx/sites-available/some_file.conf;ดังนั้นจึงไม่มีความจำเป็นในการสั่งรวมถึง

อ้างจาก Nginx CookBook page - 5.

"ในที่เก็บแพ็กเกจบางแห่งโฟลเดอร์นี้มีชื่อว่าไซต์ที่เปิดใช้งานและไฟล์คอนฟิกูเรชันจะเชื่อมโยงจากโฟลเดอร์ที่มีชื่อว่าไซต์พร้อมใช้งานโดยอนุสัญญานี้จะเลิกใช้แล้ว"


3

อาจมีเพียงการพิมพ์ผิดที่ใดก็ได้ในไฟล์ที่นำเข้าโดยการกำหนดค่า ตัวอย่างเช่นฉันพิมพ์ผิดลึกลงไปในไฟล์กำหนดค่าของฉัน:

loccation /sense/movies/ {
                  mp4;
        }

(loccation แทนตำแหน่ง) และทำให้เกิดข้อผิดพลาด:

nginx: [emerg] "server" directive is not allowed here in /etc/nginx/sites-enabled/xxx.xx:1
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.