Nginx
Nginx는 고성능의 오픈 소스 웹 서버 소프트웨어로 많은 웹 서버와 리버스 프록시로 널리 사용된다. 가볍고 확장 가능한 구조를 특징으로 하고 있으며 비동기 이벤트 기반 아키텍처로, 많은 동시 접속 요청을 효율적으로 처리하여 웹 사이트나 애플리케이션의 응답 속도와 성능을 향상시킬 수 있다. 뿐만 아니라, 가상 호스팅, 로드 밸런싱, SSL/TLS 암호화, URL 리다이렉션 등 다양한 기능을 제공하여 웹 서버의 유연성과 안정성을 높일 수 있는 등 현대적인 웹 애플리케이션의 요구사항을 충족시키기 위해 매우 유연하게 활용할 수 있다.
필자의 프로젝트에서는 Nginx는 선택이 아니라 필수 사항일 정도로 중요한 기술 중 하나이다. Nginx에 VPN 연결을 위한 암호화가 설정되어 있고 이 스펙이 옮겨질 일은 없을 것이다. 따라서 이번엔 Nginx의 설치와 실행에 대해서 알아보고 추후 Nginx의 자세한 설정을 알아보도록 한다.
Installation
Nginx를 Alpine Linux 의 패키지 매니저, apk로 손쉽게 설치가 가능하다. 설치를 위해 아래 명령어를 cli에 입력하자.
apk update
apk add nginx
설치가 완료되었으면 Nginx를 위한 새로운 사용자 그룹을 관리해야 한다. 아래 명령어를 cli에 입력하여 ‘www’라는 새로운 사용자 그룹을 만들고 www라는 사용자를 그룹에 추가한다. -D옵션(default 옵션)을 주었으므로 기본 설정을 사용하여 사용자를 추가한다.
adduser -D -g 'www' www
-D 옵션을 요약하자면 사용자를 비대화형(non-interactive)로 생성한다. 따라서 명령어 실행 중에 추가적인 프롬프트가 나타나지 않도록 한다.
또한, 새로운 사용자 그룹을 할당하여 Nginx를 따로 관리하는 것은 다양한 장점을 가질 수 있다.
- 권한 분리 및 보안 강화
- Nginx 웹 서버가 사용하는 파일과 프로세스를 별도의 사용자와 그룹에 할당하여 시스템의 다른 사용자나 프로세스와 분리된 권한 관리를 할 수 있다.
- EX) www 그룹에 속한 사용자들만 웹 서버의 파일을 읽거나 쓸 수 있도록 설정하면, 다른 사용자들이 중요한 웹 파일에 접근할 수 없게 된다.
- 파일 및 디렉토리 권한 관리
- www 사용자와 www 그룹을 생성하면, nginx가 사용하는 웹 콘텐츠(예: /var/www/html)나 설정 파일의 소유자와 그룹을 www:www로 설정할 수 있다.
- 웹 콘텐츠에 대한 읽기, 쓰기, 실행 권한을 보다 쉽게 관리할 수 있으며, nginx와 관련된 파일이 적절한 권한으로 보호된다.
- 프로세스 격리
- nginx를 www 사용자로 실행하게 되면, 웹 서버가 낮은 권한의 사용자로 동작하게 된다. 시스템 전체에 대한 보안을 강화할 수 있다.
- 낮은 권한의 사용자가 되면, nginx 프로세스가 해킹되더라도 시스템 전체에 영향을 미칠 수 있는 범위가 제한된다.
- 유연한 사용자 및 그룹 관리
- 새로운 사용자와 그룹을 생성함으로써, 다양한 웹 서비스나 애플리케이션을 별도의 사용자 및 그룹을 통해 격리된 환경에서 운영할 수 있다.
- EX) 여러 웹사이트를 하나의 서버에서 호스팅 하는 경우, 각 사이트에 대해 별도의 사용자와 그룹을 생성하여 관리할 수 있다.
- 각 사이트 간의 권한이 격리되어, 하나의 사이트에서 발생한 보안 문제가 다른 사이트에 영향을 미치는 것을 방지할 수 있다.
웹서버에서 정적으로 뿌릴 테스트용 HTML 파일을 생성하고 위치시키기 위해 아래 명령어를 입력한다.
mkdir /www
chown -R www:www /var/lib/nginx
chown -R www:www /www
vi /www/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>HTML5</title>
</head>
<body>
Server is online
</body>
</html>
chown 은 파일의 소유자(사용자)를 변경한다. 사용자 계정과 그룹 사이에 . 또는 :를 넣어 소유자와 그룹을 동시에 변경할 수 있다. chown으로 디렉토리의 소유권을 변경하면 디렉토리는 소유권이 변경되지만 디렉토리 속의 파일은 그대로 유지됩니다. -R(recursice) 옵션을 사용하면 파일의 소유권도 함께 변경한다.
Configuration
Nginx를 설치한 직후 nginx의 설정파일은 /etc/nginx/nginx.conf 경로에 위치한다. 기존의 설정 파일을 아래 명령어를 이용하여 백업해두고 새로운 설정 파일을 작성하자.
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.orig
vi /etc/nginx/nginx.conf
user www;
worker_processes auto; # it will be determinate automatically by the number of core
error_log /var/log/nginx/error.log warn;
#pid /var/run/nginx/nginx.pid; # it permit you to use rc-service nginx reload|restart|stop|start
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
access_log /var/log/nginx/access.log;
keepalive_timeout 3000;
server {
listen 80;
root /www;
index index.html index.htm;
server_name localhost;
client_max_body_size 32m;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/lib/nginx/html;
}
}
}
설정의 자세한 부분은 다음 포스팅에서 다루겠다.
Controlling
Start Nginx
Nginx를 시작하기 위해 아래와 같은 명령어를 입력해주자.
rc-service nginx start
rc-service는 Alpine Linux 및 그 외의 OpenRC 기반 시스템에서 서비스(데몬)를 관리하기 위해 사용되는 명령어이다. OpenRC는 서비스 관리 데몬으로, 부팅 프로세스를 관리하고 시스템의 서비스들을 쉽게 제어하는 역할을 한다.
Test Configuration
Nginx 설정 파일에 변경을 주거나 건드릴 때, nginx를 재시작하기 전 꼭 설정파일에 문법적, 논리적 오류가 없는지 테스트를 진행해야 한다. 방법은 간단하다. 아래와 같은 명령어를 입력한다.
nginx -t
Reload and Restart Nginx
Nginx는 설정 파일에 변경사항을 실시간으로 반영하지 않는다. 설정을 새로고침한다던가 Nginx 서버를 새롭게 시작해야 하는 작업을 거쳐야 한다. 설정 새로고침은 “hot reload” 과정으로 서버가 내려가지 않고도 설정을 반영할 수 있다. 새로운 Nginx 프로세스를 올리고 이전 프로세스를 정상 종료한다. 이때, 보류 중인 작업에 대해서는 이전 프로세스가 마저 처리하고 내려가게 된다.
서버를 새로고침하여 새로운 설정을 반영하고 싶다면 아래 명령어를 입력하자.
rc-service nginx reload
서버를 에러 등의 이유로 다시 시작하고 싶다면 아래 명령어를 입력하자.
rc-service nginx restart
Stop Nginx
서버를 중지하고 싶다면 아래 명령어를 입력하자.
rc-service nginx stop
Troubleshooting
Nginx에 이상이 있거나 트러블슈팅이 필요한 경우 아래 두 가지 명령어를 입력하여 해결해 보자.
less /var/log/nginx/error.log
less /var/log/nginx/access.log
'개발일기 > 이슈 로그' 카테고리의 다른 글
[이슈로그] Alpine Linux에서 Nessus 다운로드 2 - 트러블 슈팅 (2) | 2024.09.09 |
---|---|
[이슈로그] Alpine Linux에서 Nessus 다운로드 1 - 사건의 발단 (0) | 2024.09.09 |
[Linux] 활성화된 유닉스 도메인 목록 (0) | 2024.08.07 |
[Linux] jar 백그라운드 실행 및 로그 남기기 (0) | 2024.08.06 |
[Linux] alpine linux jdk 설치 이슈 (0) | 2024.08.06 |
댓글