웹사이트 검색

Nginx의 "일반 HTTP 요청이 HTTPS 포트로 전송되었습니다" 오류 수정


이 기사에서는 Nginx HTTP 서버에서 "400 잘못된 요청: 일반 HTTP 요청이 HTTPS 포트로 전송되었습니다"를 해결하는 방법을 보여줍니다. 이 오류는 일반적으로 HTTP 및 HTTPS 요청을 모두 처리하도록 Nginx를 구성하려고 할 때 발생합니다.

이 가이드의 목적에 따라 우리는 nginx가 서버 블록(또는 Apache의 가상 호스트)을 통해 구현된 여러 웹 사이트를 제공하는 시나리오를 고려하고 있습니다. 단 하나의 웹 사이트만 SSL을 사용하고 나머지는 SSL을 사용하지 않습니다.

또한 읽어 보세요: Nginx의 보안, 강화 및 성능 향상을 위한 궁극적인 가이드

또한 아래의 샘플 SSL 구성(보안상의 이유로 실제 도메인 이름을 변경함)을 고려해 보겠습니다. 이는 nginx에게 포트 80443을 모두 수신하도록 지시합니다. 그리고 HTTP에 대한 모든 요청은 기본적으로 HTTPS로 리디렉션되어야 합니다.

Nginx 샘플 구성

server{
        listen 80;
        server_name example.com www.example.com;
        return 301 https://www.example.com$request_uri;
}
server {
        listen 443 ssl http2;
        server_name example.com www.example.com;

        root   /var/www/html/example.com/;
        index index.php index.html index.htm;

        #charset koi8-r;
        access_log /var/log/nginx/example.com/example.com_access_log;
        error_log   /var/log/nginx/example.com/example.com_error_log   error;

        # SSL/TLS configs
        ssl on;
        ssl_certificate /etc/ssl/certs/example_com_cert_chain.crt;
        ssl_certificate_key /etc/ssl/private/example_com.key;

        include /etc/nginx/ssl.d/ssl.conf;

        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/html/example.com/;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {

                root   /var/www/html/example.com/;
                fastcgi_pass   127.0.0.1:9001;
                #fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include         fastcgi_params;
                include /etc/nginx/fastcgi_params;

        }
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
}

위 구성을 사용하면 클라이언트가 포트 80, 즉 http://example.com을 통해 사이트에 액세스하려고 하면 문제의 오류가 다음과 같이 표시됩니다. 스크린샷.

클라이언트가 HTTP를 통해 사이트에 액세스하려고 할 때마다 요청이 HTTPS로 리디렉션되기 때문에 이 오류가 발생합니다. nginx는 SSL이 트랜잭션에 사용될 것으로 예상하지만 원래 요청(포트 80을 통해 수신됨)은 일반 HTTP였기 때문에 오류를 표시합니다.

반면에 클라이언트가 https://example.com을 사용하는 경우 위의 오류가 발생하지 않습니다. 또한 SSL을 사용하지 않도록 구성된 다른 웹사이트가 있는 경우 nginx는 기본적으로 HTTPS를 사용하려고 시도하여 위 오류가 발생합니다.

이 오류를 해결하려면 구성에서 아래 줄을 주석 처리하거나 끄기로 설정하세요.

#ssl on 
OR
ssl off

파일을 저장하고 닫습니다. 그런 다음 nginx 서비스를 다시 시작하십시오.

systemctl restart nginx
OR
sudo systemctl restart nginx

이렇게 하면 nginx를 활성화하여 여러 서버 블록에 대한 HTTP 및 HTTPS 요청을 모두 처리할 수 있습니다.

마지막으로, 아래는 일반적인 Linux 배포판과 FreeBSD에서 SSL HTTPS를 설정하는 방법에 관한 기사 목록입니다.

  1. RHEL/CentOS에서 Nginx용 Let's Encrypt SSL 인증서를 사용하여 HTTPS 설정
  2. Ubuntu 및 Debian에서 무료 Let’s Encrypt SSL 인증서로 Nginx를 보호하세요.
  3. SSL로 Nginx를 보호하는 방법과 FreeBSD에서 암호화하자

지금은 여기까지입니다. 이 오류를 해결하는 다른 방법을 알고 계시다면 아래 피드백 양식을 통해 알려주시기 바랍니다.