[태그:] nginx

  • 10년짜리 만료일 긴 SSL 사설인증서 만들어 NGINX 에 설정하기

    로컬에서 개발 테스트를 위해 사설인증서를 만들 필요가 생겨서 만들어 봅니다. Ubuntu Linux 22.04 (64bit) 기준으로 설명합니다.

    # openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout 비밀키파일명.key -out 인증서파일명.cert -subj /CN=도메인이름 -days 3650
    ...+...+..+...+......+...+.+..+.......+.....+.+.....+.+........+......+......+.........+.+........+...+...+....+...+.........+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+......+.+...........+.......+..+......+....+...............+......+..+.+.........+..+.+...+..............+.+.....+......+.+..+................+..+...+......+....+..+....+.........+......+...........+.......+..+...+.+......+.....+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    .+.+......+...+..+....+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+.+.....+...+.........+.+.........+.....+.+.....+.+...+............+......+...+......+.....+...+......+.+...........+..........+...+............+.................+.......+...+...+..+.......+...+...+...+.....+.......+...+............+..+............+.+...............+...+..+....+...+...........+...................+.....+......+......+......+.......+.................+....+..+...+....+..+....+...........+.........+.........+.+............+..+.+.....+.+...............+...+.....................+..+...+.........+.+..+.........+......+.......+.....+.+.....+.+........+.+......+.....+......+...............+.......+...........+....+..+...+...+.........+...+.......+...+........+....+.....+................+............+.....+.......+......+...+..+...+.....................+....+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    -----
    

    도메인이름에 doogle.link 같이 정확히 https 로 호출할 도메인을 적으면 됩니다.

    생성된 인증서를 확인해 보겠습니다.

    # openssl x509 -in 인증서파일명.cert -noout -dates
    notBefore=Apr 19 01:22:54 2024 GMT
    notAfter=Apr 17 01:22:54 2034 GMT
    
    

    SSL 인증서와 비밀키를 설치합니다. (여기서부터는 root 권한이 있어야 합니다.)

    # sudo mv 인증서파일명.cert /etc/ssl/certs/
    # sudo mv 비밀키파일명.key /etc/ssl/private/

    이제 Nginx 서버에 SSL 인증서를 설치해 보겠습니다.

    server {
        server_name 도메인이름;
    
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        ssl_certificate "/etc/ssl/certs/인증서파일명.cert"; 
        ssl_certificate_key "/etc/ssl/private/비밀키파일명.key";
    
        # ... 기타 설정 생략 ...
    }

    Nginx 설정을 저장하고 서버를 리로드 혹은 재시작합니다.

    # sudo systemctl reload nginx

    참고

  • Nginx 에러 open socket #?? left in connection ??

    Nginx 에러 open socket #?? left in connection ??

    웹서버 운영 중 처음 보는 형태의 장애가 발생해서 해결 방법을 공유해 봅니다.

    아래와 같은 /var/log/nginx/error.log 에 아래와 같은 오류 로그가 남아있었네요.

    2024/03/21 13:53:38 [alert] 3280218#3280218: *1217 open socket #50 left in connection 73
    2024/03/21 13:53:38 [alert] 3280218#3280218: *1271 open socket #22 left in connection 74
    2024/03/21 13:53:38 [alert] 3280218#3280218: *1191 open socket #53 left in connection 76
    2024/03/21 13:53:38 [alert] 3280218#3280218: *1255 open socket #27 left in connection 80
    2024/03/21 13:53:38 [alert] 3280218#3280218: *1250 open socket #19 left in connection 82
    2024/03/21 13:53:38 [alert] 3280218#3280218: *1319 open socket #91 left in connection 83
    2024/03/21 13:53:38 [alert] 3280218#3280218: *1287 open socket #23 left in connection 85
    2024/03/21 13:53:38 [alert] 3280218#3280218: *1032 open socket #108 left in connection 89
    2024/03/21 13:53:38 [alert] 3280218#3280218: *1332 open socket #36 left in connection 92
    2024/03/21 13:53:38 [alert] 3280218#3280218: *1280 open socket #78 left in connection 93
    2024/03/21 13:53:38 [alert] 3280218#3280218: *1320 open socket #59 left in connection 94
    2024/03/21 13:53:38 [alert] 3280218#3280218: *1311 open socket #35 left in connection 95
    2024/03/21 13:53:38 [alert] 3280218#3280218: aborting
    

    위와 같은 오류가 발생하고 실제 서버가 응답을 못하고 실 도메인에 붙인 가상 서버 로그 쪽에는 499 에러가 계속해서 뜨더군요.

    최종적으로는 웹서버(reverse proxy), docker compose 로 운영 중인 웹서버+PHP-FPM+mariaDB 서버를 모두 재시작하고 나서야 정상적으로 돌아왔습니다.

    위 로그 정보로 구글 검색해 보니 Debian 계열 배포본은 ulimit 확인 시 사용자 한도가 너무 낮게 설정되어 있어 에러가 발생할 수 있다고 하네요.

    저 에러가 직접적인 웹서버 혹은 PHP-FPM 서버가 멈추는데 영향이 있는지는 모르겠지만 일단 아래와 같은 순서로 검사해서 Nginx 의 기본 설정 nginx.conf 에 설정을 추가해 주었습니다.

    ulimit 으로 먼저 현재 한도를 확인합니다.

    # ulimit -n
    1024

    Nginx 프로세스의 PID 값을 확인합니다.

    # ps aufx | grep nginx
    root     3460627  0.0  0.0  93992  3264 ?        Ss   09:44   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
    www-data 3460628  0.6  0.1  95616 13768 ?        S    09:44   0:27  \_ nginx: worker process
    www-data 3460629  0.0  0.1  94868 12052 ?        S    09:44   0:00  \_ nginx: worker process
    www-data 3460630  0.0  0.0  94300  5572 ?        S    09:44   0:00  \_ nginx: worker process
    www-data 3460631  0.0  0.0  94300  5572 ?        S    09:44   0:00  \_ nginx: worker process

    nginx worker process 중 아무거나 PID 값을 아래와 같이 넣어서 검사해 보세요

    # cat /proc/3460628/limits
    Limit                     Soft Limit           Hard Limit           Units     
    Max cpu time              unlimited            unlimited            seconds   
    Max file size             unlimited            unlimited            bytes     
    Max data size             unlimited            unlimited            bytes     
    Max stack size            8388608              unlimited            bytes     
    Max core file size        0                    unlimited            bytes     
    Max resident set          unlimited            unlimited            bytes     
    Max processes             31638                31638                processes 
    Max open files            1024                 524288               files     
    Max locked memory         65536                65536                bytes     
    Max address space         unlimited            unlimited            bytes     
    Max file locks            unlimited            unlimited            locks     
    Max pending signals       31638                31638                signals   
    Max msgqueue size         819200               819200               bytes     
    Max nice priority         0                    0                    
    Max realtime priority     0                    0                    
    Max realtime timeout      unlimited            unlimited            us

    결과를 보면 Max open files 에 Soft Limit 이 1024로 매우 낮게 설정되어 있습니다.

    제가 볼 때 여기서 두 가지 해결방안이 있는데 시스템 전체 ulimit 값을 높게 설정하는 방법이 있고 아니면 nginx.conf 에 worker_rlimit_nofile 를 최대 Hard Limit 값까지 설정하는 방법이 있을 것 같습니다.

    일단 시스템 영향이 없는 nginx.conf 설정을 하자면 아래와 같이 하면 됩니다. ( /etc/nginx/nginx.conf )

    worker_rlimit_nofile 524288;

    이후 웹서버를 재시작해 주면 됩니다.

    이제 다시 검사를 해보면 아래와 같이 Soft Limit 도 높게 나옵니다.

    # cat /proc/3460628/limits
    Limit                     Soft Limit           Hard Limit           Units     
    Max cpu time              unlimited            unlimited            seconds   
    Max file size             unlimited            unlimited            bytes     
    Max data size             unlimited            unlimited            bytes     
    Max stack size            8388608              unlimited            bytes     
    Max core file size        0                    unlimited            bytes     
    Max resident set          unlimited            unlimited            bytes     
    Max processes             31638                31638                processes 
    Max open files            524288               524288               files     
    Max locked memory         65536                65536                bytes     
    Max address space         unlimited            unlimited            bytes     
    Max file locks            unlimited            unlimited            locks     
    Max pending signals       31638                31638                signals   
    Max msgqueue size         819200               819200               bytes     
    Max nice priority         0                    0                    
    Max realtime priority     0                    0                    
    Max realtime timeout      unlimited            unlimited            us 

    이제 문제가 없기를 바랍니다. ㅜㅜ

    참고 자료

  • Nginx + php-fpm 환경에서 *.html 에서도 PHP 실행할 수 있도록 설정하기

    Nginx + php-fpm 환경에서 *.html 에서도 PHP 실행할 수 있도록 설정하기

    오랜만에 Nginx 와 php-fpm 환경 조합을 하는데 하필 *.html 확장자 파일에서도 PHP 구문이 실행되어야 정상적으로 웹사이트가 돌아가는 문제가 있었습니다. 안그러면 단순 html 문서로만 인식해서 <?php … ?> 등 php 소스 부분도 그대로 노출되고 제대로 페이지가 출력되지 않습니다.

    (더 보기…)
  • NGINX – 특정 IP 차단하거나 허용하기

    가끔 포트번호가 아닌 도메인 단위로 차단이 필요한 경우가 있다. 이럴 때 nginx 가상호스트 설정에 아래와 같은 내용을 추가하면 된다.

    예를 들어 192.168.0.7 만 허용하고 다른 모든 아이피에 대해 차단하려면

    server {
            allow 192.168.0.7;
            deny all;
            ...
    }

    이와 같이 Nginx 가상호스트 설정 변경하고 서버를 재시작 혹은 이미 시작한 경우 설정 리로드를 하면 된다.

    $ sudo systemctl reload nginx