| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Reversing
- 와이어샤크
- mount
- htmlinjection
- pwnable
- beebox
- wireshark
- c
- Linux
- 백준
- cloud
- 자료구조
- fork-bomb
- bWAPP
- SISS
- backjoon
- Dreamhack
- Systemhacking
- 유석종교수님
- docker
- AWS
- EC2
- basicrce3
- acc
- cgroup
- CodeEngn
- datastructure
- System
- python
- Reflected
- Today
- Total
Ctrl + Shift + ESC
Nginx 웹 서버 프로그램 본문
* 이 글은 코딩 자율학습 네트워크 입문을 읽고 정리한 글입니다.
Nginx란?
nginx
nginx nginx ("engine x") is an HTTP web server, reverse proxy, content cache, load balancer, TCP/UDP proxy server, and mail proxy server. Originally written by Igor Sysoev and distributed under the 2-clause BSD License. Enterprise distributions, commercial
nginx.org
Nginx는 전 세계적으로 인기 있는 고성능 오픈소스 웹 서버 프로그램 중 하나이다.
Nginx의 장점은 다음과 같다.
- 뛰어난 성능과 안정성: 적은 시스템 자원을 사용하면서도 동시에 많은 수의 접속 요청을 처리한다. 특히 정적 파일 전달 속도가 빠르다.
- 다양한 기능: 클라이언트의 요청을 다른 서버로 전달하는 리버스 프록시, 여러 서버에 작업을 분산시키는 로드 밸런서, 콘텐츠 캐싱 등 다양한 기능을 제공한다.
- 이벤트 기반 아키텍처: 이벤트 기반의 비동기 방식으로 동작한다. 프로세스 기반 또는 스레드 기반 방식에 비해 동시 접속 처리 효율이 더 좋다.
인스턴스에 SSH로 접속하기
구글 클라우드 콘솔에 접속해 VM 인스턴스를 생성한다.
인스턴스에 SSH로 접속하는 방법은 두 가지가 있다.

API 및 서비스 > 라이브러리 > Compute Engine API를 입력한 후 검색 결과에서 Compute Engine API를 선택해 설치한다.
이후 SSH 연결을 위한 공개키-개인키 쌍을 만들어 공개키를 VM에 등록한다.
그러면 웹으로도 인스턴스에 접속할 수 있다.

Compute Engine API를 설치하고 싶지 않다면, cmd에서 개인키와 vm의 퍼블릭 ip를 입력하여 인스턴스에 접속할 수 있다.
인스턴스에 Nginx 설치하기
sudo apt update
새 프로그램을 설치하기 전에 현재 컴퓨터 시스템이 알고 있는 패키지 목록과 버전 정보를 최신 상태로 갱신한다.
sudo apt install nginx
apt에 Nginx라는 이름의 패키지를 설치하라고 지시하는 명령어이다.
apt는 Nginx 설치에 필요한 모든 파일과 의존성 패키지를 자동으로 다운로드해 설치를 진행한다.
정상적으로 설치되었다면 http://<public-ip>로 접속했을 때 Nginx 페이지가 보일 것이다.
Nginx 설정 파일 구조
Nginx를 설치했으니 웹 페이지 파일을 Nginx가 찾아 사용자에게 보여줄 수 있도록 설정해야 한다.
Nginx의 설정 파일은 인스턴스의 /etc/nginx/nginx.conf에 위치한다.
여러 웹 사이트를 하나의 서버에서 운영할 때는 웹 사이트별 상세 설정을 하나의 파일(etc/nginx/nginx.conf)에 관리하는 것보다 두 개의 디렉터리로 나눠 관리하는 것이 효율적이다.
/etc/nginx/sites-available/
운영하려는 웹 사이트에 대한 설정 파일을 저장한다.
단지 사용 가능한 웹 사이트의 설정 파일을 모아두었을 뿐, 여기에 설정 파일을 저장한다고 해서 Nginx가 자동으로 읽지는 않는다.
/etc/nginx/sites-enabled/
Nginx가 실제로 읽고 웹 사이트를 띄우는 설정 파일의 심볼릭 링크가 있는 곳이다.
sites-available 디렉터리에 있는 설정 파일 중 실제로 Nginx가 활성화해 사용할 설정 파일의 심볼릭 링크를 저장한다.
Nginx가 시작되면 이 디렉터리에 있는 심볼릭 링크를 읽어 실제 서버에 반영한다.
이렇게 디렉터리를 나눠 설정 파일 및 심볼릭 링크를 관리하면 각 사이트의 설정을 독립적으로 관리하고, 필요에 따라 특정 사이트만 활성화하거나 비활성화할 수 있다.
또한 Nginx는 현재 로그인한 사용자의 계정이 아닌, 시스템에 미리 정의된 특정 사용자(우분투 등)의 권한으로 실행된다.
따라서 Nginx가 서버 블록의 root 지시어에 지정된 디렉터리 안 파일을 읽고 클라이언트의 웹 브라우저에 보여주려면 해당 파일에 대한 읽기 권한과 그 파일들이 위치한 디렉터리 및 상위 모든 디렉터리에 대한 실행 권한이 필요하다.
따라서 nginx에 보여줄 프론트엔드 파일의 위치를 리눅스 웹 서버의 표준 디렉터리인 /var/www/html/ 안으로 옮기는 것이 좋다.
sudo mv /home/<사용자이름>/project /var/www/html/
sudo chmod -R o+rX /var/www/html/project
또한 /var/www/html 경로에 대해 다른 사용자가 읽고 실행할 수 있도록 권한을 부여한다. 권한은 ls -al로 확인할 수 있다.
Nginx 서버 블록 만들기
서버 블록이란 특정 도메인 이름이나 IP 주소로 들어오는 요청을 어떻게 처리할지 정의한 설정을 말한다.
sudo nano /etc/nginx/sites-available/mywebpage
위의 명령은 sites-available 디렉터리에 웹 사이트를 보여주기 위한 설정 파일을 mywebpage라는 이름으로 만들고, 관리자 권한으로 열어 nano 편집기로 수정하겠다는 의미이다.
server {
# HTTP 요청을 80번 포트에서 수신한다.
# IPv6를 사용하는 경우, IPv6의 80번 포트에서도 수신한다. (선택)
listen 80;
listen [::]:80;
# 형식: server_name your_domain.com www.your_domain.dom;
# 연결할 도메인 이름을 적습니다(여러 개 지정할 때는 공백으로 구분)
# 지금은 도메인 이름을 '_'(기본 서버)로 두는데, _ 대신 인스턴스의 외부 IP 주소를 입력해도 된다.
server_name _;
# 웹 콘텐츠가 위치한 최상위 디렉터리를 지정한다.
root /var/www/html/project;
# 디렉터리 접근 시 기본으로 보여줄 파일을 순서대로 지정한다.
index index.html index.htm;
location / {
# 요청된 URL에 해당하는 파일을 찾고, 없으면 디렉터리를 찾고, 그래도 없으면 404 에러를 반환한다.
try_files $uri $uri/=404;
}
}
다음과 같이 작성한 뒤 crtl+x 누르고 y를 눌러 저장한 뒤에 enter로 터미널로 돌아온다.
sudo ln -s /etc/nginx/sites-available/mywebpage /etc/nginx/sites-enabled/mywebpage
sites-available 디렉터리에 만든 mywebpage 설정 파일을 Nginx가 실제로 사용할 수 있도록 sites-enabled 디렉터리에 심볼릭 링크를 생성한다.
sudo rm /etc/nginx/sites-enabled/default
Nginx를 설치하며 기본으로 생성된 default 설정 파일의 심볼릭 링크가 /etc/nginx/sites-enabled/default에 있다면, 앞서 만든 설정과의 충돌을 피해야 하므로 default 링크를 제거한다.
cd /etc/nginx/sites-enabled/
ls
/etc/nginx/sites-enabled 디렉터리에 mywebpage 파일만 존재한다면 성공적으로 mywebpage 설정 파일의 심볼릭 링크를 생성하고 기본 링크는 지워진 것이다.
sudo nginx -t
Nginx 설정을 변경한 후에는 서비스에 적용하기 전에 문법 오류가 없는지 확인해야 한다.
터미널에 successful 메시지가 출력되면 성공이다.
만약 오류 메시지가 나타난다면 메시지에 표시된 파일명과 줄 번호를 참고해 설정 파일의 오타나 잘못된 부분을 수정하고 다시 sudo nginx -t 명령을 실행한다.
sudo systemctl restart nginx
Nginx 서비스를 재시작해 웹 사이트가 정상적으로 보이는지 확인한다.
sudo systemctl status nginx
출력 내용 중 Active: active(running) 문구가 녹색으로 보이면 Nginx 서비스가 성공적으로 실행 중인 것이다.
sudo systemctl enabel nginx
인스턴스가 재부팅될 때마다 Nginx 서비스가 자동으로 시작하도록 설정한다. 이를 원치 않으면 sudo systemctl disable nginx 명령어를 입력한다.
sudo tail -f /var/log/nginx/error.log
Nginx에서 에러 로그는 /var/log/nginx/error.log에 저장된다.
nginx에서 404 not found 등의 에러가 출력되면 해당 경로를 확인하면 된다.