Nginx ๋ž€?

Nginx ๋ž€ ์›น์„œ๋ฒ„์˜ ์ผ์ข…์ด๋‹ค.

  • https
  • redirecting
  • ์ •์  ํŒŒ์ผ ์ œ๊ณต
  • ์บ์‹ฑ

Nginx ์„ค์น˜

$ sudo apt-get update
$ sudo apt-get install nginx

์ค€๋น„ํ•ด๋‘” EC2 ๋‚ด๋ถ€์—์„œ Nginx ๋ฅผ ์„ค์น˜ํ•ด์ฃผ์ž.

๋„๋ฉ”์ธ ์„ค์ •

$ sudo vi /etc/nginx/sites-available/api.gongcheck.day

๊ฐ€๋น„์•„ ๋“ฑ์—์„œ ๊ตฌ๋งคํ•œ ๋„๋ฉ”์ธ์„ ํ•ด๋‹น ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

/etc/nginx/sites-available/default ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, ํ•ด๋‹น ์„œ๋ฒ„๋กœ ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ์„ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ณ„ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ฃผ์ž.

server {
    listen 80;
    listen [::]:80;

    root /var/api/gongcheck.day/html;
    index index.html index.htm index.nginx-debian.html;

    server_name api.gongcheck.day;

    location / {
        try_files $uri $uri/ =404;
    }
}

SSL ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ ๋ฐ›๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ํŒŒ์ผ์— ์œ„์™€ ๊ฐ™์€ ์„œ๋ฒ„ ๋ธ”๋ก์„ ์ž‘์„ฑํ•ด์ฃผ์ž.

  • listen ์€ 80 ํฌํŠธ๋กœ HTTP ํ†ต์‹ ์„ ๋ฐ›๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
  • root ๋Š” ์ด ๋„๋ฉ”์ธ์œผ๋กœ ์ ‘์†ํ•  ๊ฒฝ์šฐ ํŒŒ์ผ ๊ฒฝ๋กœ์ด๋‹ค.
  • index ๋Š” ๊ธฐ๋ณธ๊ฒฝ๋กœ๋กœ ์ ‘์†ํ•  ๊ฒฝ์šฐ ๊ฐ€์žฅ ๋จผ์ € ๋ณด์—ฌ์งˆ ํŒŒ์ผ์ด๋‹ค.
  • server_name ์— ๊ตฌ๋งคํ•œ ๋„๋ฉ”์ธ๋ช…์„ ์ž‘์„ฑํ•ด์ฃผ์ž.

ํŒŒ์ผ ๋™๊ธฐํ™”

$ sudo ln -s /etc/nginx/sites-available/api.gongcheck.day /etc/nginx/sites-enabled

sites-available ์— ์ž‘์„ฑํ•œ ํŒŒ์ผ์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด sites-enabled ์— ๊ฐ™์€ ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค.

์†Œํ”„ํŠธ๋งํฌ๋ฅผ ํ†ตํ•ด ๋‘ ํŒŒ์ผ์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋„๋ก ํ•˜์ž.

Nginx ํ…Œ์ŠคํŠธ

$ sudo nginx -t
$ sudo service nginx restart

Nginx ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ๋ธ”๋ก ์˜คํƒ€ ๋“ฑ์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ดํ›„ ์žฌ์‹œ์ž‘ํ•ด์ฃผ์ž.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋ณด์ธ๋‹ค๋ฉด ํ…Œ์ŠคํŠธ์— ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

CertBot


CertBot ์ด๋ž€?

CertBot ์€ Letโ€™s Encrypt ์˜ SSL ์ธ์ฆ์„œ๋ฅผ ์‰ฝ๊ฒŒ ๋ฐœ๊ธ‰ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.

Letโ€™s Encrypt ์—์„œ ๋ฐœ๊ธ‰ ๋ฐ›์€ SSL ์ธ์ฆ์„œ๋ฅผ ํ†ตํ•ด ๋„๋ฉ”์ธ์— HTTPS ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

CertBot ์„ค์น˜

$ sudo apt-get install python3-certbot-nginx

๋„๋ฉ”์ธ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰

$ sudo certbot --nginx -d api.gongcheck.day

๋ฐœ๊ธ‰์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ๋‹ค๋ฉด sites-available ์— ์ž‘์„ฑํ–ˆ๋˜ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ •

server {
    server_name api.gongcheck.day;

    location / {
        proxy_pass http://192.168.1.199:8080/index.html;
    }

    location ^~ /api {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;

        proxy_set_header Connection '';
        proxy_http_version 1.1;
        chunked_transfer_encoding off;
        proxy_buffering off;
        proxy_cache off;

        proxy_pass http://192.168.1.199:8080; # ๊ฐœ๋ฐœ ์„œ๋ฒ„ Private IP
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot

    ssl_certificate /etc/letsencrypt/live/api.gongcheck.day/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/api.gongcheck.day/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = api.gongcheck.day) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    listen [::]:80;

    server_name api.gongcheck.day;
    return 404; # managed by Certbot
}

server ํ•˜์œ„ location ๋‚ด๋ถ€์— ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ”„๋ก์‹œ ์„ค์ •์„ ํ•ด์ฃผ์ž.

์ด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋„๋ฉ”์ธ์œผ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ๋ชจ๋‘ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

References