Category: Nginx

  • error.log 의 IP주소 차단하기

    nginx의 error.log 파일을 보면 다음 형식으로 되어 있다.

    2025/10/30 07:54:31 [crit] 77854#77854: *24699 SSL_do_handshake() failed (SSL: error:0A00006C:SSL routines::bad key share) while SSL handshaking, client: 45.249.246.17, server: 0.0.0.0:443

    검색해보면 너무 구형의 bot을 이용할 때 발생할 수 있는 오류라고 한다. 그냥 내버려 두어도 괜찮지만 이왕이면 차단해보기로 했다. 여러 단계로 나눈 후, 코파일럿의 도움으로 코드를 작성했다.

    • IP 주소를 관리할 sqlite DB 생성
    • error.log 에서 IP 주소만 parsing
    • IP 주소를 DB에 입력
    • 입력된 IP 주소를 nginx 에서 사용하는 형식으로 변환
    • cron 에 이 과정을 포함시킴
  • access.log

    '$remote_addr - $host [$time_local] '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" "$http_user_agent" "$gzip_ratio"';
    

    nginx의 access 로그 파일의 기본 설정 중 두 번째 $에 붙은 것은 remote_user 이다. 이것을 $host로 바꾸어 주었다.

    나중에 생각해 보니 $host를 추가하면 되는 것이었다. IP 주소로 접속해 오는 것과 도메인으로 접속해 오는 것을 구별하고 싶었다. 그래서 검색했더니 $host를 옵션이 이 기능을 했다.

    로그 파일에서 많은 접속이 IP 주소로 온다는 것을 알게 되었다. 그래서 별도로 nginx 의 블록을 만들어 444 응답을 하도록 했다.

  • NGINX code 444

    블로그 웹서버 로그를 보면 OpenAI부터 시작해 다양한 IP에서 접속 시도하는 것을 볼 수 있다.

    대부분 IP 주소로 접근하는 것이다. 응답을 하지 않는 것이 더 좋을 것 같았다.

    nginx의 공식 문서에 이와 같은 상황에서 이용할 수 있는 설정이 있다. nginx에서만 이용하는 444 응답 코드를 이용하는 것이다.

    코파일럿에게도 물어 보았다. 아래와 같이 하면 좋을 것 같다고 한다.

    server {
        listen 80 default_server;
        server_name _ "";
    
        return 444;
    }
  • Under reverse proxy

    예전에 시도했을 때에는 잘 안되었다. 이번에는 성공했다.

    내가 시도한 환경은 도커 컨테이너에서 Grafana와 PostgreSQL, NGINX를 이용하여 80번 포트로 접속하도록 하는 것이다. 다른 경우로 사용할 것을 대비하여 subfolder에 연결되도록 했다.

    /etc/grafana/grafana.ini 파일에서 [server] 부분을 수정한다.

    [server]
    domain = dorm.welovedoctor.com
    root_url = http://dorm.welovedoctor.com/grafana/
    serve_from_sub_path = true

    /etc/nginx/sites-available/default 파일에서 다음과 같이 수정한다.

    map $http_upgrade $connection_upgrade {
      default upgrade;
      '' close;
    }
    
    upstream grafana {
      server localhost:3000;
    }
    
    server {
      listen 80 default_server;
      listen [::]:80 default_server;
      root /var/www/html;
      server_name dorm.welovedoctor.com;
      location /grafana/ {
        proxy_set_header Host $host;
        proxy_pass http://grafana;
      }
    
      location /grafana/api/live/ {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $host;
        proxy_pass http://grafana;
      }
    
    }