Nginx 주로 사용하는 기능들 정리

baealex

소비적인 일보단 생산적인 일을 좋아합니다.

Sign in to view email

Nginx

Nginx는 C언어와 유사한 문법을 통해 웹서버를 유연하게 다룰 수 있다. 필자는 Nginx에 대해 완벽하게 문법을 이해하고 있는 상태는 아니지만, 몇몇의 자주 사용하게 되는 기능들을 정리해 놓고자 한다. 필자가 주로 사용하는 기능이라는 의미이며 Nginx를 처음 다루는 사용자가 보면 도움이 되지 않을까 싶다.

  • 별도의 server 구문이 적혀져 있지 않다면 server 구문 안에 작성된다는 의미로 보면된다.
  • [여기에 적히는 값]은 개인별로 달라지는 값을 의미한다.


리디렉션

도메인 리디렉션

어떤 도메인에 접근했을 때 다른 도메인으로 보내주려면 아래와 같이 작성한다. CNAME으로 넘겨주는 방법도 있겠지만 홈페이지의 도메인을 변경했을때 SEO에 적은 영향을 미치게 하고 싶어 이와같이 하였다.

return 301 https://[mydomain.com]$request_uri;


특정 URL 리디렉션

URL이 변경되어 특정 위치에 접근했을때 다른 페이지로 념겨주려면 아래와 같이 작성한다. 코드는 필자의 블로그의 링크를 예시로 들었다.

location = /programing/Qt-Connect {
    return 301 /qt/connect;
}


HTTPS 리디렉션

사용자가 http로 접근했을때 https로 리디렉션 해주려면 아래와 같이 작성한다. 클라우드 플레어를 사용한다면 기본적으로 적용되므로 안해줘도 된다.

if ($scheme = http) {
    return 301 https://$server_name$request_uri;
}


Custom 404, 403

404(Not Found) 혹은 403(Fobidden) 에러가 발생했을 때 접속한 사용자에게 커스텀 된 페이지를 보여준다. 가령 404 에러가 발생했을때 비슷한 문서를 찾을 수 있도록 검색 페이지를 제공해 줄 수 있다.

error_page 404 /404.html;
    location /404.html {
    internal;
}

error_page 403 /403.html;
    location /403.html {
    internal;
}

이제 커스텀 된 페이지를 /404.html에 작성해 두면 되겠다.


특정 파일 접근 차단

어떤 파일 확장자에만 접근을 불가능하게 하고 싶다면 아래와 같이 작성해 줄 수 있다.

location ~ \.txt$ {
    return 403;
}

위와같이 작성하면 모든 텍스트 파일의 접근을 차단한다.


URL에서 .html 삭제

/about.html에 있는 파일이지만 /about으로 접근할때 보여줄 수 있는 방법이다. URL이 깔끔해 진다.

try_files $uri $uri.html $uri/ =404;

about으로 접근했을때 about.html을 먼저 찾아보고 없다면 about/index.html을 찾아 볼 것이다. 그래도 없으면 404 에러가 발생한다.


요청시 패스워드

특정 디렉토리로 접근할때 사용자/비밀번호를 입력하도록 하는 방법은 다음과 같다.

location /Private/ {
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/private/.htpasswd;
}

.htpasswd는 아파치 유틸을 이용해서 생성해 주어야 한다.


.htpasswd 생성방법
sudo apt-get install apache2-utils

비밀번호를 생성할 경로는 어디를 사용하던 상관없지만 필자는 /etc/nginx/private에 넣었다. 다만 해당 파일은 절대 웹서버 공간안에 있어선 안된다. 외부 사용자가 내용을 살펴볼 수 있게 된다.

sudo htpasswd -c /etc/nginx/private/.htpasswd baejino

-ccreate를 의미한다. 해당 파일에 다른 계정이 등록되어 있어도 -c를 사용하면 덮어쓰기가 된다. 패스워드를 수정하려면 아래와 같이 입력하면 된다.

sudo htpasswd /etc/nginx/private/.htpasswd baejino

MD5 알고리즘을 이용하여 암호를 생성하려면 다음과 같이 입력한다.

sudo htpasswd -mb /etc/nginx/private/.htpasswd baejino mypasswd


스태틱 파일 캐시

이미지 파일이나 css, js의 경우 캐싱하지 않을시 서버 입장에서는 불필요한 리소스를 낭비하는 셈이며 방문자도 '이 사이트는 뭔가 느리다'라는 인식을 심어줄 수 있다.

location ~* \.(?:jpg|jpeg|png|gif|ico|gz|svg|svgz|ogg|mp4|webm|ogv|htc|cur)$ {
    expires 3M;
    access_log off;
    add_header Cache-Control "public";
}

location ~* \.(?:css|js)$ {
    expires 1M;
    access_log off;
    add_header Cache-Control "public";
}

location = /favicon.ico {
    expires max;
    access_log off;
    log_not_found off;
}


핫링크 차단

타 도메인에서 내 사이트의 이미지를 가져가는 것을 hotlink라고한다. 이를 아래와 같이 차단할 수 있다.

location ~* \.(?:jpg|jpeg|png|gif|ico|gz|svg|svgz|ogg|mp4|webm|ogv|htc|cur)$ {
    valid_referers none blocked [mydomain.com] [*.mydomain.com];
    if ($invalid_referer) {
        return 403;
    }
}

만일 차단된 이미지의 경우 다른 이미지를 출력하려면

location ~* \.(?:jpg|jpeg|png|gif|ico|gz|svg|svgz|ogg|mp4|webm|ogv|htc|cur)$ {
    valid_referers none blocked [mydomain.com] [*.mydomain.com];
    if ($invalid_referer) {
        rewrite (.*)$ /assets/images/403.jpg redirect;
    }
}

location = /assets/images/403.jpg { }


CORS

반대로 타 도메인에서 폰트와 같은 파일은 애초에 접근이 불가한데 이를 허용해주려면 아래와 같이 설정한다.

location ~* \.(eof|otf|ttf|woff|woff2)$ {
    add_header Access-Control-Allow-Origin *;
}


프록시 패스

장고나 Node.js를 사용하는 경우 프록시 패스를 사용하여 Nginx에서 접근하게 할 수 있다.

location / {
    proxy_pass http://127.0.0.1:8000/;
}


프록시 캐시

정적 파일을 여러개의 서버로 분리하여 운영하는 경우 주로 사용하는 방법으로 정적 파일을 프록시 서버에서 캐싱시킬 수 있다.

http {
    proxy_cache_path /var/www/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
    proxy_temp_path /var/www/cache/tmp;

    server {
        location / {
            proxy_pass [https://mydomain.com];
            proxy_cache my-cache;
            proxy_cache_valid 200 302 60m;
            proxy_cache_valid 404 1m;
        }
    }
}

levels는 캐시파일을 어떻게 저장할지를 결정한다. 만약 levels를 설정하지 않는다면, 캐시파일은 현재 디렉토리에 저장이 된다. level을 설정할 경우, 서브디렉토리에 md5 해시된 파일이름으로 컨텐츠를 저장한다. level=1:2는 첫번째 단계의 디렉토리는 한글자, 두번째 단계의 디렉토리는 두 글자로 명명하라는 의미다.


업로드 사이즈

일정 사이즈가 넘어가는 요청을 차단한다.

client_max_body_size 10M;
작성된 댓글이 없습니다!
로그인된 사용자만 댓글을 작성할 수 있습니다.