Thực hành tốt nhất của NGinx


46

Những thực hành tốt nhất nào bạn sử dụng trong khi sử dụng NGinx?


Chỉ cần lưu ý rằng điều này không hoạt động cho một thiết lập Magento. Vẫn đang điều tra lý do nhưng tôi nghĩ nó có liên quan đến chuỗi truy vấn.
Jauder Ho

location / wordpress phải hữu ích khi bạn có wordpress trong thư mục con có tên là "wordpress". Thế còn khi chúng ta có wordpress trong web root "/" thì sao?
rahul286

Câu trả lời:


21

Cách kết hợp các khối HTTP và HTTPS.

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

Điều này đã được đăng như là một câu trả lời cho một câu hỏi khác nhau. Xem tại đây .



15

Nói chung, sử dụng "nếu" là một thực hành xấu (theo tác giả của nginx). nếu có thể, tốt hơn là sử dụng lệnh try_file của error_page thay vì "if (-f ...)"

Kết hợp mẹo với tệp notifyenence.html và mẹo với try_files chúng tôi nhận được:

vị trí / {
    try_files /maintenance.html $ uri $ uri / @wordpress;
}

Khi bảo trì kết thúc, chỉ cần bảo trì mv.html từ $ root.


16
Điều này không lý tưởng vì /maintenance.html sẽ được phục vụ dưới dạng 200 phản hồi. Bạn có thể muốn các công cụ tìm kiếm nhận ra rằng trang bảo trì không phải là trang web thực sự của bạn. Bạn có thể muốn trả lại 503 (Dịch vụ tạm thời không khả dụng). Cách duy nhất tôi có thể tìm ra cách để làm điều này là với một if (-f ...) { return 503; }error_page 503 /maintenance.html. Bạn nghĩ sao?
Aaron Gibralter


8

Nó thường hiệu quả hơn khi sử dụng lệnh mapthay cho các biểu thức thông thường khi chuyển đổi gốc cho các tên miền phụ phù hợp:

server {

    server_name mysite.tld ~^.+\.mysite\.tld$;

    map $host $files {
        default            common;
        mysite.tld         common;
        www.mysite.tld     common;
        admin.mysite.tld   admin;
        system.mysite.tld  system;
        *.mysite.tld       users;
    }

    root /var/www/mysite/$files;

}

5
bạn có biết rằng bạn có thể thực hiện server_name mysite.tld * .mysite.tld
Không biết

8

Các empty_gifmô-đun cũng là rất hữu ích, đặc biệt là nếu bạn cần giám sát phản hồi từ máy chủ web (sử dụng Nagios / monit / etc):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

location /img/1px.gif {
    empty_gif;
} 

1
Bạn có thể cung cấp một ví dụ thế giới thực cho điều này? Tôi vẫn không hoàn toàn hiểu nó hữu ích như thế nào.
Nhà phát triển Pixel

1
@ Nhà phát triển Pixel, nó chỉ thực sự hữu ích cho tốc độ. Nginx giữ dữ liệu cho một gif trống trong bộ nhớ để nó không bao giờ phải tải từ đĩa.
Không biết

5
Ngoài ra, access_log off;đối với những địa điểm này là thông lệ
SaveTheRbtz

6

Chúng tôi đã thiết lập Nginx với Chef, sử dụng sách dạy nấu ăn này chứa các tập lệnh để xử lý cấu hình nginx tương tự như cách Debian làm Apache2 và một số mẫu mẫu có mặc định lành mạnh.


5

Đây là một phương pháp tốt để trả về một trang bảo trì. Tất cả các yêu cầu được viết lại và mã http chính xác được trả lại. (Lỗi 503: Dịch vụ không khả dụng)

error_page 503 /maintenance.html;

location /
{
    if (-f $document_root/maintenance.html)
    {
        return 503;
    }

    try_files $uri /index.php?$args;
}

location = /maintenance.html
{
    rewrite ^ /maintenance.html break;
}

1
Trên thực tế, tôi không đồng ý - Tôi đã thêm một nhận xét vào serverfault.com/questions/18994/nginx-best-practices/ ,. Về cơ bản, bạn muốn trả về lỗi 503 nếu không các bot và người lập chỉ mục sẽ nghĩ rằng trang bảo trì của bạn là một phần của trang web thực sự của bạn ... Không có gì sai với một iftuyên bố nếu bạn sử dụng đúng - tài liệu nói rằng ifnó an toàn nếu bạn 'tái chỉ làm return xxx;.
Aaron Gibralter

Ngoài ra, có location = /maintenance.html { break; }cần thiết?
Aaron Gibralter

4

Từ nginx 0.7.12 trở lên, "" có thể sử dụng được trong server_name để bắt các yêu cầu mà không cần tiêu đề "Máy chủ".

Bạn có thể sử dụng các mục sau đây như một lưu ý cho các máy chủ ảo không xác định.

server {
  server_name _ "";
}

Có phải ví dụ của bạn chỉ hoạt động đối với các yêu cầu với một vhost không xác định hoặc nó cũng sẽ hoạt động với các yêu cầu với một vhost không xác định (sai)?
Benoit

@Benoit nó hoạt động cho bất cứ điều gì không được xác định.
Không biết

Có phải "server_name _ *" không được hỗ trợ nginx 0.7 trở đi không?
rahul286

1
Xin lưu ý điều này chỉ đúng một phần. "" sẽ bắt được tiêu đề MISSING Host, nhưng nó sẽ không bắt được yêu cầu với tiêu đề Host không khớp với bất cứ thứ gì. Nếu bạn muốn một khối máy chủ bắt tất cả thì hãy xem cờ default_server bên dưới chỉ thị lắng nghe.
Martin Fjordvald


3

Tôi không biết nếu đó là một thực tiễn tốt nhất, nhưng chắc chắn là một bản hack gọn gàng để có được các điều kiện lồng nhau trong nginx. Đây là một mẫu từ wiki nginx .

location /xxxx/ {
  set $test "";

  if ($request_method = POST) {
    set $test  P;
  }

  if ($http_cookie ~* "CCCC=.+(?:;|$)" ) {
    set $test  "${test}C";
  }

  if ($test = PC) {
    #rewrite rule goes here.
  } 
}

3
Tôi đã đặt nó trong danh mục "thực hành xấu xí nhưng đôi khi cần thiết" - chắc chắn không phải là thứ gì đó được khuyến khích.
womble

2

Nếu bạn cần lật theo ngữ cảnh giữa http và https cho các tên miền phụ được xử lý bởi cùng một khối máy chủ, bạn có thể sử dụng các biến để làm như vậy. Có thể không phải là cách hiệu quả nhất để làm mọi thứ, nhưng nó hoạt động:

server {
  server mysite.tld ~^.+\.mysite\.tld$;

  set $req_ssl = 0;

  map $host $files {
      default            common;
      mysite.tld         common;
      www.mysite.tld     common;
      admin.mysite.tld   admin;
      system.mysite.tld  system;
      *.mysite.tld       users;
  }

  root /var/www/mysite/$files;

  if ( $files = "admin" ){
    set $req_ssl 1;
  }

  if ( $files = "common" ){
    set $req_ssl 2;
  }

  if ( $scheme = http )
  {
    set $req_ssl $req_ssl.1;
  }

  if ( $scheme = https )
  {
    set $req_ssl $req_ssl.2;
  }

  if ($req_ssl = 1.1){
    rewrite ^ https://$host$uri;
  }

  if ($req_ssl = 2.2){
    rewrite ^ http://$host$uri;
  }

}

2

Tôi luôn cố gắng sử dụng lệnh roottrong đầu khối máy chủ để tôi có thể tận dụng $document_rootbiến và không bao giờ, nhưng không bao giờ, bao gồm lệnh roottrong khối vị trí.

Các cạm bẫy Trang từ Nginx wiki có một số lời khuyên tuyệt vời về thực hành tốt nhất.


1

Nếu bạn đang sử dụng nginx làm proxy, việc điều chỉnh cài đặt thời gian chờ có thể rất quan trọng để đảm bảo bạn không bị mất kết nối nginx trước khi ứng dụng của bạn được thực hiện với chúng, đặc biệt nếu bạn đang xử lý một ứng dụng lưu lượng truy cập cao:

proxy_connect_timeout
proxy_send_timeout

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.