nginx 서버 열기 - Mac Mini로 홈서버 구축하기 #2
Let’s Encrypt를 통해 SSL 인증서를 받기 전에, 먼저 nginx를 통해 웹서버를 구축해보겠습니다.
nginx 사용에 익숙하지 않으니 GPT의 도움을 받아서 최소한의 기능만 하는 nginx 서버를 설정해보겠습니다.
필요 준비물: Docker
디렉토리 구조
먼저 다음과 같은 디렉토리 구조를 만들어주세요:
1
2
3
4
5
6
7
8
9
10
.
├── conf
│ ├── nginx.conf
│ └── sites-enabled
│ └── default.conf
├── docker-compose.yml
├── html
│ └── index.html
└── logs
└── nginx
각 파일의 역할은 다음과 같습니다:
conf/
: nginx 설정 파일들을 담는 디렉토리html/
: 웹서버에서 제공할 정적 파일들을 담는 디렉토리logs/
: nginx 로그 파일들이 저장되는 디렉토리
설정 파일 작성
docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
services:
nginx:
image: nginx:latest
container_name: my-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./html:/usr/share/nginx/html:ro
- ./conf/nginx.conf:/etc/nginx/nginx.conf:ro
- ./conf/sites-enabled:/etc/nginx/conf.d:ro
- ./logs/nginx:/var/log/nginx
restart: unless-stopped
주요 설정 설명:
image: nginx:latest
: Docker Hub에서 최신 nginx 이미지를 가져옵니다container_name: my-nginx
: 컨테이너를 식별하기 위한 이름을 지정합니다ports
:"80:80"
: HTTP 기본 포트 (외부:내부)"443:443"
: HTTPS 기본 포트 (추후 SSL 인증서 설정 시 사용)
volumes
:./html:/usr/share/nginx/html:ro
: 로컬 html 폴더를 컨테이너 내부 정적 파일 디렉토리에 읽기 전용으로 연결./conf/nginx.conf:/etc/nginx/nginx.conf:ro
: nginx 메인 설정 파일 교체./conf/sites-enabled:/etc/nginx/conf.d:ro
: 개별 사이트 설정 파일들을 담는 디렉토리./logs/nginx:/var/log/nginx
: 로그 파일들을 로컬에 저장
restart: unless-stopped
: 컨테이너가 예기치 않게 종료되었을 때 자동으로 재시작
nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
user www-data; # Nginx 프로세스를 실행할 사용자 지정
worker_processes auto; # 워커 프로세스 수 (auto: CPU 코어 수에 맞춤)
error_log /var/log/nginx/error.log warn; # 에러 로그 위치 및 레벨
pid /var/run/nginx.pid; # PID 파일 경로
events {
worker_connections 1024; # 워커당 최대 연결 수
}
http {
include mime.types; # MIME 타입 매핑
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;
keepalive_timeout 65;
# 사이트별 설정 불러오기 (Docker 볼륨 마운트에 맞춤)
include /etc/nginx/conf.d/*.conf;
}
설정 설명:
user www-data
: nginx 프로세스를 www-data 사용자로 실행합니다. 보안상 root가 아닌 일반 사용자로 실행하는 것이 좋습니다worker_processes auto
: CPU 코어 수에 맞춰 워커 프로세스를 자동으로 설정합니다worker_connections 1024
: 각 워커 프로세스가 동시에 처리할 수 있는 연결 수를 지정합니다sendfile on
: 파일 전송 성능을 향상시키는 설정입니다keepalive_timeout 65
: 연결을 유지하는 시간을 65초로 설정합니다
default.conf
1
2
3
4
5
6
7
8
9
10
11
server {
listen 80; # 수신 포트 (HTTP 기본 80)
server_name myhome.duckdns.org; # 매칭할 도메인 또는 IP 주소
root /usr/share/nginx/html; # 웹 루트 디렉토리
index index.html index.htm; # 기본 문서
# 기본 정적 파일 서빙
location / {
try_files $uri $uri/ =404;
}
}
중요한 설정:
server_name
: 본인의 도메인 주소로 수정해주세요!- DuckDNS로 설정한 도메인 (예:
myhome.duckdns.org
)을 사용하세요
- DuckDNS로 설정한 도메인 (예:
root
: 웹서버의 루트 디렉토리를 지정합니다index
: 기본 문서 파일들을 순서대로 찾아서 제공합니다try_files
: 요청된 파일이 없으면 404 에러를 반환합니다
index.html
간단한 테스트 페이지를 만들어보겠습니다:
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Nginx 테스트 페이지</title>
</head>
<body>
<h1>Hello World!</h1>
<p>nginx 서버가 정상적으로 작동하고 있습니다.</p>
</body>
</html>
서버 실행
모든 파일을 작성한 후, 다음 명령어로 서버를 실행합니다:
1
docker-compose up -d
-d
옵션: 백그라운드에서 실행 (데몬 모드)-d
옵션을 빼면 로그가 터미널에 실시간으로 출력됩니다
확인 방법
서버가 정상적으로 실행되면 브라우저에서 http://myhome.duckdns.org
(또는 설정한 도메인 주소)로 접속합니다.
“Hello World!” 문구가 출력되면 정상적으로 실행된 것입니다.
만약 접속이 안 된다면 다음을 확인해보세요:
- 포트 포워딩: 공유기에서 80번 포트를 Mac Mini로 포워딩했는지 확인
- 방화벽: Mac의 방화벽에서 80번 포트가 열려있는지 확인
- Docker 컨테이너 상태:
docker ps
명령어로 컨테이너가 실행 중인지 확인
이제 기본적인 nginx 서버가 구축되었습니다. 다음 글에서는 Let’s Encrypt를 사용해서 SSL 인증서를 설정하고 HTTPS를 활성화해보겠습니다.
This post is licensed under CC BY 4.0 by the author.