닉스 SSL이랑 리디렉션한 횟수가 너무 많습니다라고 뜹니다

아파치 하다가 여러가지 설정 안쓸거면 닉스가 가볍고 속도가 좋다는 말에 닉스로 옮겼습니다.

워드프레스 설치하고 acme.sh SSL을 설치했는데 그 마지막 단계에서 사이트 접속이 안됩니다

/etc/nginx/sites-available/default.conf

 

server {
    listen 443 ssl http2;
    server_name 도메인.com;
    root /var/www/wordpress;
    charset utf-8;
  location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    }
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_trusted_certificate /etc/nginx/ssl/chain.pem;

}

server {
    listen 443 ssl http2 default;
    server_name www.도메인.com;
    location / {
        return 301 https://도메인.com$request_uri;
        expires epoch;
    }
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_trusted_certificate /etc/nginx/ssl/chain.pem;
    # 이곳에서는 사이트 경로 설정이나 XE 설정, PHP 연동 설정 등을 하지 않음
    # SSL 인증서 설정은 위와 동일하게 해야 함
}

 

server {
    listen 80 default;
    server_name 도메인.com www.도메인.com;
    location / {
        return 301 https://도메인.com$request_uri;
        expires epoch;
    }
    # 이곳에서는 사이트 경로 설정이나 XE 설정, PHP 연동 설정 등을 하지 않음
    # 단, Let's Encrypt 인증서 발급을 위해 /.well-known/ 폴더는 특별 처리해도 무방함
}

 

  • profile

    이 부분의 설정만 봐서는 딱히 이상이 없어 보입니다.

     

    워드프레스, 라이믹스 등 대부분의 CMS는 자기가 어떤 도메인에 설치되었는지 기억하고 다른 도메인으로 접속할 경우 원래 설치되었던 도메인으로 포워딩시키는 기능이 있습니다. (www가 붙은 도메인과 안 붙은 도메인은 "수원"과 "과수원"이 서로 무관한 단어이듯 전혀 다른 도메인으로 취급합니다.) 만약 워드프레스에서 사이트 주소가 www.도메인.com으로 설정되어 있다면

     

    1) 사용자가 도메인.com으로 접속

    2) 워드프레스에서 www.도메인.com으로 포워딩시킴

    3) 서버에서 도메인.com으로 포워딩시킴

    4) 워드프레스에서 www.도메인.com으로 포워딩시킴

    5) 서버에서 도메인.com으로 포워딩시킴

     

    이렇게 무한루프에 빠져 리다이렉트 횟수가 초과될 가능성이 있습니다.

     

    만약 이런 상황이라면 서버 설정에서도 도메인.com과 www.도메인.com을 서로 바꿔서 워드프레스 쪽에 맞춰줘야 합니다. www를 떼고 싶으시더라도 워드프레스 설정에서 일단 떼어 놓고 서버 설정을 바꾸셔야 서로 충돌하지 않겠지요.

     

    링크를 안 남기셔서 자세히 알 수는 없지만, 만약 클라우드플레어(클플) 등 SSL을 임의로 조작하는 부류의 서비스를 이용하고 계시다면 그것 때문에 무한루프에 빠지기도 합니다. 만약 클플을 쓰신다면 SSL 설정 화면에서 "가변"이 아닌 "전체" 방식을 선택하세요. 서버에 이미 SSL 설정이 되어 있는 상태에서 "가변"을 선택하면 충돌납니다.

  • profile ?

    워드프레스 주소를 https://도메인.com으로 바꾸고
    root /var/www/wordpress; 여기 밑에
    index index.php index.html index.htm index.nginx-debian.html;  << 이걸 추가했더니 됐네요

     

    이제 아래쪽 코드로 설정을해서 홈페이지가 들어가지는데, 아래처럼 사용해도 사이트에 문제가 없을까요??

    여러가지 외국 사이트들 다 해봤는데 되는건 일단 이것뿐이네여

     

    server {

        listen 443 ssl http2;

        server_name 도메인.com;

        root /var/www/wordpress;

        index index.php index.html index.htm index.nginx-debian.html;  << 추가한것

        location / {

             try_files $uri $uri/ /index.php$is_args$args;

        }

     

        location ~ \.php$ {

                include snippets/fastcgi-php.conf;

                fastcgi_pass unix:/run/php/php8.1-fpm.sock;

        }

     

        ssl_certificate_key /etc/nginx/ssl/privkey.pem;

        ssl_certificate /etc/nginx/ssl/fullchain.pem;

        ssl_trusted_certificate /etc/nginx/ssl/chain.pem;

    }

     

    server {

        listen 443 ssl http2 default;

        server_name www.도메인.com;

        location / {

            return 301 https://도메인.com$request_uri;

            expires epoch;

        }

        ssl_certificate_key /etc/nginx/ssl/privkey.pem;

        ssl_certificate /etc/nginx/ssl/fullchain.pem;

        ssl_trusted_certificate /etc/nginx/ssl/chain.pem;

        # 이곳에서는 사이트 경로 설정이나 XE 설정, PHP 연동 설정 등을 하지 않음

        # SSL 인증서 설정은 위와 동일하게 해야 함

    }

     

     

     

    server {

        listen 80 default;

        server_name 도메인.com www.도메인.com;

        location / {

            return 301 https://도메인.com$request_uri;

            expires epoch;

        }

        # 이곳에서는 사이트 경로 설정이나 XE 설정, PHP 연동 설정 등을 하지 않음

        # 단, Let's Encrypt 인증서 발급을 위해 /.well-known/ 폴더는 특별 처리해도 무방함

    }

  • ? profile
    네, 사이트 접속도 안 되는 상태라면 DB를 직접 수정해야 해서 혹시 곤란하실까 봐 www 쪽으로 맞춰보라고 말씀드린 건데, 워드프레스 설정을 직접 바꾸실 수 있었다면 그것도 괜찮습니다.

    index.nginx-debian.html은 필요없습니다. 사이트에 아무 것도 업로드하지 않아서 기본 화면 나올 때만 쓰는 파일이예요. 실제로 저 파일이 있다 해도 사이트를 운영중일 때는 안 나와야 정상이겠지요.
  • profile ?
    사이트 접속은 클플 가변으로 해두고 디폴트 파일 초기 상태로 하니까 되는거 같았어여!
    index index.php index.html index.htm index.nginx-debian.html; 이거를
    index index.php; << 이렇게 바꿧어요 감사합니다 ㅎㅎㅎ

    제가 저번에 아파치 host를 기진곰님의 조언에 따라 5개로 만들었는데 아이피로 들어가면 에러 뜨잖아여?
    닉스도 기진곰님이 올려주신 https://xetown.com/tips/1172256 이 링크를 보고 했는데

    이거는 IP로 들어가면 도메인으로 리디렉션 되더라고요
    이게 정상적으로 적용이 된거죠?
  • ? profile
    아파치와 마찬가지로 설정을 5개 만들어서 어떤 것은 deny all; 하고, 어떤 것은 메인으로 포워딩시키고, 적절히 나눠야지요. 설정하지 않은 도메인이나 IP로 접속하면 맨 처음 설정한 것으로 연결시킨다는 점은 아파치든 nginx든 다 똑같습니다. 그래서 접근 금지나 포워딩 관련된 설정을 먼저 하고, 메인 사이트를 처리하는 부분은 마지막으로 옮기는 것이 좋아요.
  • ?

    어... 5개로 하셔서 해야한다 했는데 nginx는 인터넷에 찾아봐도 적용이 안되서 아래처럼 하니까 적용되는데 이렇게 써도 가능할까요??

     

    server {

        listen 443 ssl http2;

        server_name 도메인.com;

        root /var/www/wordpress;

        index index.php;

        location / {

             try_files $uri $uri/ /index.php$is_args$args;

        }

     

        location ~ \.php$ {

                include snippets/fastcgi-php.conf;

                fastcgi_pass unix:/run/php/php8.1-fpm.sock;

        }

     

        ssl_certificate_key /etc/nginx/ssl/privkey.pem;

        ssl_certificate /etc/nginx/ssl/fullchain.pem;

        ssl_trusted_certificate /etc/nginx/ssl/chain.pem;

    }

     

    server {

        listen 443 ssl http2 default;

        server_name _;

        if ($host = 'www.도메인.com') {

            return 301 https://도메인.com$request_uri;

        }

     

        ssl_certificate_key /etc/nginx/ssl/privkey.pem;

        ssl_certificate /etc/nginx/ssl/fullchain.pem;

        ssl_trusted_certificate /etc/nginx/ssl/chain.pem;

     

        return 444;

        # 이곳에서는 사이트 경로 설정이나 XE 설정, PHP 연동 설정 등을 하지 않음

        # 단, Let's Encrypt 인증서 발급을 위해 /.well-known/ 폴더는 특별 처리해도 무방함

    }

     

    server {

        listen 80 default;

        server_name _;

        if ($host = '도메인.com') {

            return 301 https://도메인.com$request_uri;

        }

        if ($host = 'www.도메인.com') {

            return 301 https://도메인.com$request_uri;

        }

        return 444;

        # 이곳에서는 사이트 경로 설정이나 XE 설정, PHP 연동 설정 등을 하지 않음

        # 단, Let's Encrypt 인증서 발급을 위해 /.well-known/ 폴더는 특별 처리해도 무방함

    }

     

    이제 아이피로 접속하게되면

    http://아이피/  "전송한 데이터가 없습니다."

    https://아이피/의 웹페이지가 일시적으로 다운되었거나 새 웹 주소로 완전히 이동했을 수 있습니다.
    각각 이렇게 뜹니다!

  • ? profile

    네, 그렇게 하셔도 됩니다. nginx 설정 문법은 아파치보다 좀더 일반적인 프로그래밍 언어에 가까운 모습이므로 if문과 같은 로직을 활용하면 꼭 5개가 아니어도 충분히 구현할 수 있습니다. 위에서 하신 것처럼 포트별로 각각 하나씩 default를 선언하고, 도메인이 맞는 경우에만 포워딩하고 나머지는 일부러 에러를 뿜는 거죠.

     

    return 444는 응답 없이 접속을 끊어버리라는 뜻이기 때문에 브라우저에서 오류가 나는 것이 정상이지만, 서버 모니터링이라든지 다른 부분에서 장애가 발생한 것으로 오인할 우려가 있으니 403이나 404로 바꾸시는 것을 추천합니다.

  • profile ?
    403으로 했고 성공했습니다!
    보안을 위해 SSH 포트 변경하였고, fail2ban 했습니다!!
    iptables이랑 root 막고 sudo은 안했는데 이 정도로도 충분할까요?