NGinx 모범 사례


46

NGinx를 사용하는 동안 어떤 모범 사례를 사용하십니까?


Magento 설정에서는 작동하지 않습니다. 여전히 이유를 조사하고 있지만 쿼리 문자열과 관련이 있다고 생각합니다.
Jauder Ho 2006 년

location / wordpress는 "wordpress"라는 하위 디렉토리에 wordpress가있을 때 유용해야합니다. 웹 루트 "/"에 워드 프레스가있는 경우는 어떻습니까?
rahul286

답변:


21

HTTP 및 HTTPS 블록을 결합하는 방법

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

이것은 다른 질문에 대한 답변으로 게시되었습니다. 여기를 참조하십시오 .



15

일반적으로 "if"를 사용하는 것은 좋지 않습니다 (nginx의 저자에 따라). 가능한 경우, "if (-f ...)"대신 error_page 지시문의 try_file을 사용하는 것이 좋습니다.

maintenence.html 파일과 tip을 결합하고 try_files와 tip을 결합하면 다음과 같은 이점이 있습니다.

위치 / {
    try_files /maintenance.html $ uri $ uri / @wordpress;
}

유지 관리가 끝나면 $ root의 mv maintenance.html 만 있습니다.


16
/maintenance.html이 200 개의 응답으로 제공되므로 이상적이지 않습니다. 검색 엔진이 유지 관리 페이지가 실제 웹 사이트가 아님을 인식하기를 원할 것입니다. 503 (서비스를 일시적으로 사용할 수 없음)을 반환 할 수 있습니다. 나는이 작업을 수행하는 방법을 알아낼 수있는 유일한 방법은 함께 if (-f ...) { return 503; }하고 error_page 503 /maintenance.html. 어떻게 생각해?
Aaron Gibralter


8

map일치하는 하위 도메인의 루트를 전환 할 때 정규 표현식 대신 지시문 을 사용하는 것이 종종 더 효율적입니다 .

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
server_name mysite.tld * .mysite.tld
알 수 없음

8

empty_gif모듈은 특히 웹 서버에서 모니터 응답이 필요한 경우 (nagios / monit / etc 사용) 매우 유용합니다.

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

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

1
이에 대한 실제 예를 제공 할 수 있습니까? 나는 그것이 그것이 어떻게 유용한 지 여전히 완전히 이해하지 못한다.
픽셀 개발자

1
@ Pixel Developer는 속도에 유일하게 유용합니다. Nginx는 메모리에 빈 gif에 대한 데이터를 유지하므로 디스크에서로드 할 필요가 없습니다.
알 수없는

5
또한 access_log off;그 위치에 대한 일반적입니다
SaveTheRbtz

6

Debian의 Apache2와 유사한 nginx 구성을 처리하기위한 스크립트와 기본값이 잘못된 샘플 템플릿이 포함 된 이 요리 책 을 사용하여 Chef로 Nginx를 설정했습니다 .


5

다음은 유지 보수 페이지를 반환하는 좋은 방법입니다. 모든 요청이 다시 작성되고 올바른 http 코드가 리턴됩니다. (503-서비스 불가)

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
사실, 나는 동의하지 않습니다. 나는 serverfault.com/questions/18994/nginx-best-practices/…에 의견을 추가했습니다 . 기본적으로, 당신은 유지 보수 페이지가 실제 사이트의 일부라고 생각하는 503 오류 또는 다른 봇 및 인덱서를 반환 할 ...에 아무것도 잘못있다 if올바르게 사용할 경우 문 - 워드 프로세서가 그 말 if의 당신이 경우 안전 '단지 일을 다시 return xxx;.
Aaron Gibralter

또한 location = /maintenance.html { break; }필요합니까?
Aaron Gibralter

4

nginx 0.7.12 이상에서 ""는 "호스트"헤더없이 요청을 포착하기 위해 server_name에서 사용할 수 있습니다.

다음을 정의되지 않은 가상 호스트의 포괄으로 사용할 수 있습니다.

server {
  server_name _ "";
}

예제는 정의되지 않은 가상 호스트가있는 요청에 대해서만 작동합니까, 아니면 알 수없는 (잘못된) 가상 호스트가있는 요청에서도 작동합니까?
Benoit 2016 년

@Benoit 그것은 정의되지 않은 무엇이든 작동합니다.
알 수없는

"server_name _ *"는 nginx 0.7 이상에서 지원되지 않습니까?
rahul286

1
이것은 부분적으로 만 사실입니다. ""는 MISSING Host 헤더를 포착하지만 일치하지 않는 Host 헤더를 가진 요청은 포착하지 않습니다. 포괄 서버 블록을 원하면, Listen 지시문 아래의 default_server 플래그를 참조하십시오.
Martin Fjordvald


3

그것이 모범 사례인지는 모르겠지만 nginx에서 중첩 된 조건을 얻는 깔끔한 해킹입니다. 다음은 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
나는 "추악하지만 때로는 필요한 연습"의 범주에 넣었습니다.
womble

2

동일한 서버 블록이 처리하는 하위 도메인에 대해 http와 https를 문맥 상으로 전환해야하는 경우 변수를 사용하여 수행 할 수 있습니다. 가장 효율적인 방법은 아니지만 효과가 있습니다.

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

나는 항상 root서버 블록의 맨 위에 지시문 을 사용하려고 하므로 $document_root변수를 활용할 수는 있지만 절대로 절대로 root지시문을 위치 블록 안에 포함시키지 마십시오 .

Nginx 위키 의 함정 페이지 에는 모범 사례에 대한 유용한 팁이 있습니다.


1

nginx를 프록시로 사용하는 경우, 특히 트래픽이 많은 응용 프로그램을 처리하는 경우 응용 프로그램을 사용하기 전에 nginx 연결이 끊어지지 않도록 시간 초과 설정을 조정하는 것이 중요 할 수 있습니다.

proxy_connect_timeout
proxy_send_timeout

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.