HTTP와 동일한 구성으로 제공되는 nginx HTTPS


195

두 개의 nginx server {}블록 에서 구성 지시문을 공유하는 방법이 있습니까? 내 사이트의 HTTPS 및 HTTP 콘텐츠가 정확히 동일한 구성으로 제공되므로 규칙 복제를 피하고 싶습니다.

현재 다음과 같습니다.

server {
  listen 80;
  ...
}

server {
  listen 443;

  ssl on; # etc.
  ...
}

다음 라인을 따라 무언가를 할 수 있습니까?

server {
  listen 80, 443;
  ...

  if(port == 443) {
    ssl on; #etc
  }
}

답변:


262

이를 다음과 같이 하나의 서버 블록으로 결합 할 수 있습니다.

server {
    listen 80;
    listen 443 default_server ssl;

    # other directives
}

공식 사용법


6
아, nginx가 포트 80을 통해로드 된 경우 SSL 지시문을 무시할만큼 지능적이라는 것을 몰랐습니다.
ceejayoz

72
nginx는 모든 종류의 WIN입니다.
Jauder Ho

5
당신은 하나 개의 서버에서 여러 사이트가 있다면, 그것은 "기본"의무 아니라고 언급 할 가치
luchaninov가

4
너무 우아해서 아파요.
Alix Axel

3
여기서 작동하지 않습니다 ... "일반 HTTP 요청이 HTTPS 포트로 전송되었습니다"
gcstr

87

허용 된 답변을 명확하게하려면 생략해야합니다.

SSL on;

0.8.21 이후의 nginx 버전의 경우 다음이 필요합니다.

listen 443 ssl;

참고:

Nginx Docs-단일 HTTP / HTTPS 서버 구성


2
감사합니다! http에서 아무것도 작동하지 않는 이유를 알 수 없었습니다. SSL 제거 중; 일했다.
Chris Cummings

27

나는 당신이 제안하는 방법을 모르지만 확실히 쉽고 유지 보수가 쉬운 방법이 있습니다.

공통 서버 설정을 별도의 파일 (예 : "serverFoo.conf")로 이동 한 후 다음 과 같이 include별도의 server {}블록으로 이동하십시오.

server {
    listen 80;
    include serverFoo.conf;
}
server {
    listen 443 ssl;
    include serverFoo.conf;
}

2
+1 = 저에게 효과적입니다. (다른 방법으로는 작동하지 않습니다.)

또한 다른 예제는로드 밸런서 역할을하는 경우 'proxy_pass'를 고려하지 않습니다.
Mike Purcell

이 옵션은 server_name각 포트마다 다른 경우에
유용합니다

5
SSL을 사용하지 말고 listen 443 ssl;지금부터 사용하십시오 .
danger89

이것은 최근 nginx 1.10.1에서 작동하는 유일한 솔루션 인 것 같습니다. 어떤 이유로 두 listen줄은 올바르게 해석되지 않지만 분리하기 위해 이동하면 server{}수정됩니다.
Artur Bodera

9

이미 유용한 답변을 확장하면 다음과 같은 더 완전한 예가 있습니다.

server {

    # Listen on port 80 and 443
    # on both IPv4 and IPv6
    listen 80;
    listen [::]:80 ipv6only=on;
    listen 443 ssl;
    listen [::]:443 ipv6only=on ssl;

    # Set website folder
    root /path/to/your/website;

    # Enable SSL
    ssl_certificate your-cert.pem;
    ssl_certificate_key your-cert.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
    ssl_prefer_server_ciphers on;
}

2
나는 이것이 꽤 오래된 대답이라는 것을 알고 있지만, 매우 완벽하기 때문에 SSLOD3 프로토콜을 POODLE 취약점에 취약한 것으로 비활성화해야한다는 점을 지적하고 싶었습니다 : disablessl3.com 대신 사용 : ssl_protocols TLSv1 TLSv1 .1 TLSv1.2;
user147787

4

Igor / Jauder의 게시물에 추가하기 위해 특정 IP를 듣고 있다면 다음을 사용할 수 있습니다.

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