Ruby / Sinatra 앱으로 nginx를 실행 중이며 모두 잘 작동합니다. 그러나 현재 동일한 서버에서 두 번째 응용 프로그램을 실행하려고하는데 이상한 것이 있습니다. 먼저 내 nginx.conf는 다음과 같습니다.
pid /tmp/nginx.pid;
error_log /tmp/nginx.error.log;
events {
worker_connections 1024;
accept_mutex off;
}
http {
default_type application/octet-stream;
access_log /tmp/nginx.access.log combined;
sendfile on;
tcp_nopush on;
tcp_nodelay off;
gzip on;
gzip_http_version 1.0;
gzip_proxied any;
gzip_min_length 500;
gzip_disable "MSIE [1-6]\.";
gzip_types text/plain text/xml text/css
text/comma-separated-values
text/javascript application/x-javascript
application/atom+xml;
upstream app {
server unix:/var/www/app/tmp/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 80;
client_max_body_size 4G;
server_name FAKE.COM;
keepalive_timeout 5;
root /var/www/app/public;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
if (!-f $request_filename) {
proxy_pass http://app;
break;
}
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /var/www/app/public;
}
}
}
68,0-1 B
서버가 다른 도메인 이름을 통해 해당 서버에 충돌하는 모든 호스트에 응답 하는 방법 server_name
에 FAKE.COM
유의하십시오. 특정 서버가 요청에 대해서만 응답하도록하려면 FAKE.COM
어떻게해야합니까?
답변
nginx 설정의 첫 번째 서버 블록은 특정 서버 블록이없는 서버에 도달하는 모든 요청의 기본값입니다.
구성에서 실제 도메인이 REAL.COM이라고 가정하면 사용자가 입력하면 서버로 확인 되며이 설정에 대한 서버 블록이 없으므로 FAKE.COM의 서버 블록이 첫 번째입니다 서버 블록 (귀하의 경우 서버 블록 만)이 해당 요청을 처리합니다.
이것이 적절한 Nginx 설정이 특정 도메인에 대한 다른 서버를 따르기 전에 기본값에 대한 특정 서버 블록을 갖는 이유입니다.
# Default server
server {
return 404;
}
server {
server_name domain_1;
[...]
}
server {
server_name domain_2;
[...]
}
기타
** 편집하다 **
일부 사용자는이 예제에서 약간 혼란스러워 단일 conf 파일 등으로 제한된다고 생각합니다.
위는 OP가 필요에 따라 개발하는 간단한 예입니다.
개인적으로 이와 같이 별도의 vhost conf 파일을 사용합니다 (CentOS / RHEL) :
http {
[...]
# Default server
server {
return 404;
}
# Other servers
include /etc/nginx/conf.d/*.conf;
}
/etc/nginx/conf.d/
domain_1.conf, domain_2.conf … domain_n.conf를 포함합니다. domain_n.conf는 기본 nginx.conf 파일에서 서버 블록 다음에 포함되며, 항상 첫 번째이며 default_server로 재정의되지 않는 한 항상 기본값입니다. 다른 곳에서 지시하십시오.
이 경우 다른 서버에 대한 conf 파일의 파일 이름의 알파벳 순서는 관련이 없습니다.
또한이 배열은 여러 기본값을 정의 할 수 있다는 점에서 많은 유연성을 제공합니다.
필자의 경우에는 내부 인터페이스에서만 포트 8080을 수신하는 Apache를 사용하고 PHP 및 Perl 스크립트를 Apache로 프록시합니다.
그러나 Apache가 표준 포트 80에서 실행되고 있지 않다는 것을 감지하고 나를 “도움”시키려고 할 때 첨부 된 출력 HTML에서 “: 8080″으로 링크를 반환하는 두 개의 별도 응용 프로그램을 실행합니다.
외부 인터페이스에서 Apache에 도달 할 수없고 링크가 포트 80을 가리켜 야하므로 링크가 유효하지 않은 문제가 발생합니다.
이러한 요청을 리디렉션하기 위해 포트 8080에 대한 기본 서버를 생성하여이 문제를 해결합니다.
http {
[...]
# Default server block for undefined domains
server {
listen 80;
return 404;
}
# Default server block to redirect Port 8080 for all domains
server {
listen my.external.ip.addr:8080;
return 301 http://$host$request_uri;
}
# Other servers
include /etc/nginx/conf.d/*.conf;
}
일반 서버 블록의 포트 8080에서 수신 대기하는 것이 없으므로 리디렉션 기본 서버 블록은 nginx.conf에서의 위치 때문에 이러한 요청을 투명하게 처리합니다.
실제로 이러한 서버 블록 중 4 개가 있으며 이는 간단한 사용 사례입니다.
답변
catch-all 의 기본 서버가 있어야합니다 . 연결을 닫고 아무것도 반환하지 않는 nginx 특정 HTTP 응답을 404
반환하여 전혀 응답하지 않기 위해 반환 하거나 더 나은 대역폭을 절약 할 수 있습니다444
server {
listen 80 default_server;
server_name _; # some invalid name that won't match anything
return 444;
}
답변
다른 답변으로 문제를 해결할 수 없습니다. 호스트가 일치하는지 확인하고 403을 반환하면 문제가 해결되었습니다. (웹 서버 콘텐츠를 가리키는 임의의 웹 사이트가 있습니다. 검색 순위를 가로 챌 것 같습니다)
server {
listen 443;
server_name example.com;
if ($host != "example.com") {
return 403;
}
...
}
답변
귀하의 질문에 대답하기 위해-nginx는 일치하는 것이 없으면 첫 번째 서버를 선택합니다. 설명서를 참조하십시오 :
해당 값이 서버 이름과 일치하지 않거나 요청에이 헤더 필드가 전혀 없으면 nginx는이 포트의 기본 서버로 요청을 라우팅합니다. 위의 구성에서 기본 서버는 첫 번째 서버입니다.
이제 모든 요청에 대해 404로 응답하는 기본 catch-all 서버를 원한다면 다음과 같이하십시오.
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_certificate <path to cert>
ssl_certificate_key <path to key>
return 404;
}
인증서 / 키 (자체 서명 가능)를 지정해야합니다. 그렇지 않으면 nginx가이 default_server를 사용하여 연결을 수락하려고 시도하고 인증서 / 키를 찾지 못하므로 모든 SSL 연결이 실패합니다.
답변
기본 서버를 지정하는 몇 가지 방법이 있습니다.
첫 번째 방법 -위에 표시된 Dayo와 같이 하나의 구성 파일에 서버 구성을 유지하는 경우 목록에서 기본 서버를 먼저 지정하십시오.
두 번째 방법 (더 나은) 더 융통성 있음- 명령에 대한 default_server
매개 변수를 제공하십시오 ( listen
예 :
server {
listen *:80 default_server;
root /www/project/public/;
}
자세한 내용은 여기 : Nginx doc / Listen
이 방법은 서버 구성을 별도의 파일로 유지하고 해당 파일의 이름을 사전 순으로 지정하지 않을 때 더 유용합니다.
답변
대답 할 작은 의견 :
sites-available /에있는 여러 구성 파일의 여러 IP에 여러 개의 가상 호스트가있는 경우 IP의 “기본”도메인보다 첫 번째 파일에서 알파벳 순서로 가져옵니다.
Pavel이 말했듯이 “listen”지시문에 대한 “default_server”인수가 있습니다 http://nginx.org/en/docs/http/ngx_http_core_module.html#listen