Search

์„ค์ • ํŒŒ์ผ

Nginx ์„ค์ • ํŒŒ์ผ

๊ฐœ์š”

Nginx์˜ ๋ชจ๋“  ๋™์ž‘์€ /etc/nginx/nginx.conf ์„ค์ • ํŒŒ์ผ์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค. ์ง€์‹œ์–ด(Directive)์™€ ๋ธ”๋ก(Block)์œผ๋กœ ๊ตฌ์„ฑ๋œ ๊ณ„์ธต์  ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.
Nginx์˜ ํ•ต์‹ฌ์€ ๊ฒฐ๊ตญ ์„ค์ • ํŒŒ์ผ์ด์—์š”. Nginx ์ž์ฒด๋Š” ๊ทธ๋ƒฅ ์—”์ง„์ด๊ณ , ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€๋Š” ์ „๋ถ€ ์„ค์ • ํŒŒ์ผ์—์„œ ์ •ํ•˜๊ฑฐ๋“ ์š”. ๋น„์œ ํ•˜์ž๋ฉด, Nginx๋Š” ๋นˆ ์Šค๋งˆํŠธํฐ์ด๊ณ , ์„ค์ • ํŒŒ์ผ์€ ์•ฑ์„ ์„ค์น˜ํ•˜๊ณ  ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•˜๋Š” ๊ฑฐ์˜ˆ์š”.
์„ค์ • ํŒŒ์ผ์„ ์ž˜ ๋‹ค๋ฃจ๋ฉด ์ •์  ํŒŒ์ผ ์„œ๋น™, ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, SSL ๋“ฑ ๋ญ๋“  ํ•  ์ˆ˜ ์žˆ์–ด์š”!

์„ค์ • ํŒŒ์ผ ์ „์ฒด ๊ตฌ์กฐ

graph TD
    A["nginx.conf<br/>๋ฉ”์ธ ์„ค์ • ํŒŒ์ผ"] --> B["์ „์—ญ ๋ธ”๋ก (main)<br/>์›Œ์ปค ํ”„๋กœ์„ธ์Šค, ๋กœ๊ทธ ๋“ฑ"]
    A --> C["events ๋ธ”๋ก<br/>์—ฐ๊ฒฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹"]
    A --> D["http ๋ธ”๋ก<br/>์›น ์„œ๋ฒ„ ์„ค์ •"]

    D --> E["server ๋ธ”๋ก<br/>๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ (์‚ฌ์ดํŠธ๋ณ„)"]
    D --> F["upstream ๋ธ”๋ก<br/>๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๊ทธ๋ฃน"]

    E --> G["location ๋ธ”๋ก<br/>URL ๊ฒฝ๋กœ๋ณ„ ์ฒ˜๋ฆฌ"]

    style A fill:#FFD700
    style D fill:#87CEEB
    style E fill:#90EE90
    style G fill:#FFB3B3
Mermaid
๋ณต์‚ฌ
graph LR
    subgraph "๊ณ„์ธต ๊ตฌ์กฐ"
        M[main] --> EV[events]
        M --> H[http]
        H --> S1[server 1]
        H --> S2[server 2]
        S1 --> L1[location /]
        S1 --> L2[location /api/]
        S2 --> L3[location /]
    end
Mermaid
๋ณต์‚ฌ

nginx.conf ์ „์ฒด ์˜ˆ์‹œ (์ฃผ์„ ํ•ด์„ค)

# ============================================ # ์ „์—ญ ๋ธ”๋ก (main context) # ============================================ user www-data; # Nginx ์›Œ์ปค ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ์‚ฌ์šฉ์ž worker_processes auto; # ์›Œ์ปค ํ”„๋กœ์„ธ์Šค ์ˆ˜ (auto = CPU ์ฝ”์–ด ์ˆ˜) pid /run/nginx.pid; # PID ํŒŒ์ผ ์œ„์น˜ error_log /var/log/nginx/error.log warn; # ์—๋Ÿฌ ๋กœ๊ทธ ๊ฒฝ๋กœ ๋ฐ ๋ ˆ๋ฒจ # ============================================ # events ๋ธ”๋ก # ============================================ events { worker_connections 1024; # ์›Œ์ปค๋‹น ์ตœ๋Œ€ ๋™์‹œ ์—ฐ๊ฒฐ ์ˆ˜ multi_accept on; # ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์—ฐ๊ฒฐ ์ˆ˜๋ฝ } # ============================================ # http ๋ธ”๋ก # ============================================ http { # MIME ํƒ€์ž… ์„ค์ • include /etc/nginx/mime.types; default_type application/octet-stream; # ๋กœ๊ทธ ํฌ๋งท ์ •์˜ log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; access_log /var/log/nginx/access.log main; # ์„ฑ๋Šฅ ์ตœ์ ํ™” sendfile on; # ์ปค๋„์—์„œ ์ง์ ‘ ํŒŒ์ผ ์ „์†ก tcp_nopush on; # ํŒจํ‚ท ์ตœ์ ํ™” keepalive_timeout 65; # ์—ฐ๊ฒฐ ์œ ์ง€ ์‹œ๊ฐ„ (์ดˆ) gzip on; # gzip ์••์ถ• ํ™œ์„ฑํ™” # ์‚ฌ์ดํŠธ๋ณ„ ์„ค์ • ํŒŒ์ผ ํฌํ•จ include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
Plain Text
๋ณต์‚ฌ

๊ฐ ๋ธ”๋ก ์ƒ์„ธ ์„ค๋ช…

1. ์ „์—ญ ๋ธ”๋ก (main)

์ง€์‹œ์–ด
๊ฐ’
์„ค๋ช…
user
www-data
์›Œ์ปค ํ”„๋กœ์„ธ์Šค ์‹คํ–‰ ์‚ฌ์šฉ์ž
worker_processes
auto
์›Œ์ปค ํ”„๋กœ์„ธ์Šค ์ˆ˜ (auto = CPU ์ฝ”์–ด ์ˆ˜๋งŒํผ)
pid
/run/nginx.pid
๋งˆ์Šคํ„ฐ ํ”„๋กœ์„ธ์Šค PID ํŒŒ์ผ ์œ„์น˜
error_log
๊ฒฝ๋กœ ๋ ˆ๋ฒจ
์—๋Ÿฌ ๋กœ๊ทธ ํŒŒ์ผ๊ณผ ๋กœ๊ทธ ๋ ˆ๋ฒจ
์ „์—ญ ๋ธ”๋ก์€ Nginx ์ „์ฒด์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์„ค์ •์ด์—์š”. ์–ด๋–ค ๋ธ”๋ก์—๋„ ์†ํ•˜์ง€ ์•Š๋Š” ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์˜ ์„ค์ •๋“ค์ด ์—ฌ๊ธฐ์— ์™€์š”.

2. events ๋ธ”๋ก

์ง€์‹œ์–ด
๊ฐ’
์„ค๋ช…
worker_connections
1024
์›Œ์ปค ํ•˜๋‚˜๊ฐ€ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ๊ฒฐ ์ˆ˜
multi_accept
on
ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ์—ฐ๊ฒฐ์„ ๋™์‹œ์— ์ˆ˜๋ฝ
use
epoll
์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ (๋ฆฌ๋ˆ…์Šค: epoll)
์ตœ๋Œ€ ๋™์‹œ ์—ฐ๊ฒฐ ์ˆ˜ = worker_processes ร— worker_connections ์˜ˆ: 4 ร— 1024 = 4,096๊ฐœ ๋™์‹œ ์—ฐ๊ฒฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ!

3. http ๋ธ”๋ก

http ๋ธ”๋ก์€ ์›น ์„œ๋ฒ„ ๊ด€๋ จ ๋ชจ๋“  ์„ค์ •์„ ๊ฐ์‹ธ๋Š” ํฐ ๋ธ”๋ก์ด์—์š”. ์—ฌ๊ธฐ ์•ˆ์— server ๋ธ”๋ก, upstream ๋ธ”๋ก ๋“ฑ์ด ๋“ค์–ด๊ฐ€์š”.

4. server ๋ธ”๋ก (๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ)

server { listen 80; # ์ˆ˜์‹  ํฌํŠธ server_name example.com www.example.com; # ๋„๋ฉ”์ธ root /var/www/html; # ์›น ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ index index.html; # ๊ธฐ๋ณธ ๋ฌธ์„œ location / { try_files $uri $uri/ =404; } }
Plain Text
๋ณต์‚ฌ
์ง€์‹œ์–ด
์„ค๋ช…
์˜ˆ์‹œ
listen
์ˆ˜์‹ ํ•  ํฌํŠธ
80, 443 ssl
server_name
๋งค์นญํ•  ๋„๋ฉ”์ธ ์ด๋ฆ„
example.com *.example.com
root
์›น ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ
/var/www/html
index
๊ธฐ๋ณธ ๋ฌธ์„œ ํŒŒ์ผ๋ช…
index.html index.htm
server ๋ธ”๋ก ํ•˜๋‚˜๊ฐ€ ํ•˜๋‚˜์˜ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋‹ด๋‹นํ•ด์š”. ๋„๋ฉ”์ธ๋ณ„๋กœ ๋‹ค๋ฅธ server ๋ธ”๋ก์„ ๋งŒ๋“ค๋ฉด, ํ•œ ๋Œ€์˜ ์„œ๋ฒ„์—์„œ ์—ฌ๋Ÿฌ ์›น์‚ฌ์ดํŠธ๋ฅผ ์šด์˜ํ•  ์ˆ˜ ์žˆ์–ด์š”!

5. location ๋ธ”๋ก (URL ๊ฒฝ๋กœ๋ณ„ ์ฒ˜๋ฆฌ)

graph TD
    A["ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ<br/>URL ๊ฒฝ๋กœ"] --> B{location ๋งค์นญ}
    B -->|"/"| C["location / <br/>๊ธฐ๋ณธ ๋งค์นญ"]
    B -->|"/api/"| D["location /api/<br/>ํ”„๋ก์‹œ ์ „๋‹ฌ"]
    B -->|"/images/"| E["location /images/<br/>์ •์  ํŒŒ์ผ + ์บ์‹ฑ"]
    B -->|".php$"| F["location ~ \\\\.php$<br/>์ •๊ทœ์‹ ๋งค์นญ"]

    style C fill:#90EE90
    style D fill:#87CEEB
    style E fill:#FFD700
    style F fill:#DDA0DD
Mermaid
๋ณต์‚ฌ

location ๋งค์นญ ์šฐ์„ ์ˆœ์œ„

์ˆœ์œ„
๊ธฐํ˜ธ
์˜๋ฏธ
์˜ˆ์‹œ
1
=
์ •ํ™•ํžˆ ์ผ์น˜
location = /favicon.ico
2
^~
์ ‘๋‘์‚ฌ ์ผ์น˜ (์ •๊ทœ์‹ ๋ฌด์‹œ)
location ^~ /images/
3
~
์ •๊ทœ์‹ ์ผ์น˜ (๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„)
location ~ \\.php$
4
~*
์ •๊ทœ์‹ ์ผ์น˜ (๋Œ€์†Œ๋ฌธ์ž ๋ฌด์‹œ)
location ~* \\.(jpg\|png)$
5
(์—†์Œ)
์ ‘๋‘์‚ฌ ์ผ์น˜ (์ผ๋ฐ˜)
location /api/
6
/
๊ธฐ๋ณธ ๋งค์นญ (๋ชจ๋“  ์š”์ฒญ)
location /
์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฒƒ๋ถ€ํ„ฐ ๋งค์นญ๋ผ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด /favicon.ico ์š”์ฒญ์ด ์˜ค๋ฉด, location = /favicon.ico(์ •ํ™• ๋งค์นญ)๊ฐ€ location /(๊ธฐ๋ณธ ๋งค์นญ)๋ณด๋‹ค ๋จผ์ € ์„ ํƒ๋ผ์š”.

์ž์ฃผ ์“ฐ๋Š” ์„ค์ • ํŒจํ„ด

์ •์  ํŒŒ์ผ ์„œ๋น™

location / { root /var/www/html; index index.html; try_files $uri $uri/ /index.html; # SPA(React) ๋Œ€์‘ }
Plain Text
๋ณต์‚ฌ

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

location /api/ { proxy_pass <http://localhost:8080>; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
Plain Text
๋ณต์‚ฌ

์ •์  ํŒŒ์ผ ์บ์‹ฑ

location ~* \\.(css|js|png|jpg|gif|ico|woff2)$ { expires 30d; add_header Cache-Control "public, immutable"; }
Plain Text
๋ณต์‚ฌ

HTTP โ†’ HTTPS ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ

server { listen 80; server_name example.com; return 301 https://$host$request_uri; }
Plain Text
๋ณต์‚ฌ

์„ค์ • ํŒŒ์ผ ๊ด€๋ฆฌ ๋ฐฉ์‹

flowchart TD
    A["nginx.conf<br/>(๋ฉ”์ธ โ€” ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Œ)"] -->|include| B["sites-enabled/*<br/>(ํ™œ์„ฑํ™”๋œ ์‚ฌ์ดํŠธ)"]
    A -->|include| C["conf.d/*.conf<br/>(์ถ”๊ฐ€ ์„ค์ •)"]

    D["sites-available/<br/>(๋ชจ๋“  ์‚ฌ์ดํŠธ ์„ค์ • ๋ณด๊ด€)"] -->|"์‹ฌ๋ณผ๋ฆญ ๋งํฌ"| B

    style A fill:#FFD700
    style B fill:#90EE90
Mermaid
๋ณต์‚ฌ
๊ถŒ์žฅ ๋ฐฉ์‹: nginx.conf๋Š” ๊ฐ€๊ธ‰์  ์ˆ˜์ •ํ•˜์ง€ ๋ง๊ณ , ์‚ฌ์ดํŠธ๋ณ„ ์„ค์ •์€ sites-available/์— ํŒŒ์ผ์„ ๋งŒ๋“  ๋’ค sites-enabled/์— ๋งํฌ!
# ์ƒˆ ์‚ฌ์ดํŠธ ์„ค์ • ๋งŒ๋“ค๊ธฐ sudo nano /etc/nginx/sites-available/mysite.conf # ํ™œ์„ฑํ™” (์‹ฌ๋ณผ๋ฆญ ๋งํฌ) sudo ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/ # ๊ธฐ๋ณธ ์‚ฌ์ดํŠธ ๋น„ํ™œ์„ฑํ™” (ํ•„์š”์‹œ) sudo rm /etc/nginx/sites-enabled/default # ํ…Œ์ŠคํŠธ ํ›„ ์ ์šฉ sudo nginx -t && sudo systemctl reload nginx
Bash
๋ณต์‚ฌ

์ฃผ์š” ๋ณ€์ˆ˜ (Variables)

Nginx๊ฐ€ ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ ์ž๋™์œผ๋กœ ์ฑ„์›Œ์„œ ์ œ๊ณตํ•˜๋Š” ๋‚ด์žฅ(๋ฏธ๋ฆฌ ์ •์˜๋œ) ๋ณ€์ˆ˜๋ผ์„œ ๋ณ„๋„๋กœ ์„ ์–ธํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
๋ณ€์ˆ˜
์„ค๋ช…
์˜ˆ์‹œ ๊ฐ’
$host
์š”์ฒญ๋œ ํ˜ธ์ŠคํŠธ๋ช…
example.com
$uri
ํ˜„์žฌ ์š”์ฒญ URI
/api/users
$request_uri
์ฟผ๋ฆฌ์ŠคํŠธ๋ง ํฌํ•จ URI
/api/users?page=1
$remote_addr
ํด๋ผ์ด์–ธํŠธ IP
192.168.1.100
$scheme
ํ”„๋กœํ† ์ฝœ
http ๋˜๋Š” https
$server_name
server_name ๊ฐ’
example.com
$request_method
HTTP ๋ฉ”์„œ๋“œ
GET, POST
$status
์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ
200, 404

ํ•ต์‹ฌ ์ •๋ฆฌ

Nginx ์„ค์ • = ์ง€์‹œ์–ด(Directive)์™€ ๋ธ”๋ก(Block)์˜ ๊ณ„์ธต ๊ตฌ์กฐ
ํ•ต์‹ฌ ๋ธ”๋ก: main โ†’ events โ†’ http โ†’ server โ†’ location
server ๋ธ”๋ก = ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ (๋„๋ฉ”์ธ๋ณ„ ์‚ฌ์ดํŠธ ์„ค์ •)
location ๋ธ”๋ก = URL ๊ฒฝ๋กœ๋ณ„ ์ฒ˜๋ฆฌ ๊ทœ์น™
์„ค์ • ๊ด€๋ฆฌ:
sites-available/์— ๋ณด๊ด€ โ†’ sites-enabled/์— ๋งํฌ โ†’ nginx -t โ†’ reload