리눅스 Nginx 서버 구축 및 Vue 프로젝트 빌드 방법

리눅스 Nginx 설치 시 참고
https://nginx.org/en/linux_packages.html
Nginx 공식 홈페이지에서 리눅스 OS 종류별 Nginx 웹서버 설치 방법을 자세히 알려주고 있습니다.


우분투 Nginx 서버 설치 방법 (인터넷O)

인터넷이 가능한 서버에서만 가능한 방법입니다.

Nginx 저장소 필수 패키지 설치

sudo apt install curl gnupg ca-certificates lsb-release ubuntu-keyring

nginx 저장소 추가 시 필요한 필수 패키지들을 다운로드하여 준비합니다.

Nginx 공식 서명 키 등록

curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Nginx 패키지가 공식 저장소 nginx.org에서 서명한 것인지 검증하기 위해 GPG 서명 키를 다운로드해서 저장합니다.
GPG 키를 등록하지 않으면, apt가 보안상 믿을 수 없다고 설치를 거부하게 됩니다.

GPG 서명 키 검증

gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

방금 받은 서명 키가 nginx.org에서 제공한 키인지 확인합니다.

573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62

위와 같은 출력이 포함되면 정상 키입니다.

Nginx 공식 저장소 추가

Stable 버전 추가 명령어

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

최신이 아닐 수 있지만, 안정적인 버전의 Nginx 저장소를 추가합니다.

Mainline 버전 추가 명령어

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

실험적일 수 있지만, 최신 버전의 Nginx 저장소를 추가합니다.

Pinning 설정

echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
    | sudo tee /etc/apt/preferences.d/99nginx

Ubuntu 기본 저장소에 있는 Nginx가 아니라, nginx.org 저장소에서 받은 패키지를 우선 설치하도록 설정합니다.

NginX 설치

sudo apt update
sudo apt install nginx

apt update 명령어로 추가된 저장소 목록을 최신화 후, Nginx를 설치합니다.


우분투 Nginx 서버 설치 방법 (인터넷X)

인터넷 연결이 불가한 운영서버에서 Nginx를 설치하는 방법입니다.

Nginx 설치 패키지 파일 다운로드

https://nginx.org/packages/ubuntu/pool/nginx/n/nginx
위 링크는 nginx 공식 패키지 저장소에서 우분투 nginx 패키지가 모여 있는 풀 디렉토리입니다.
리눅스 OS 버전 및 CPU 종류에 맞는 Nginx 설치 패키지 파일을 다운로드 합니다.
nginx-dbg 파일은 개발 및 디버깅용이므로, nginx_1.28.0-1~noble_amd64.deb 같은 파일을 받아야 합니다.

Nginx 설치

cd /deb파일위치
sudo apt install ./nginx_1.28.0-1~noble_amd64.deb

윈도우에서 다운받은 Nginx 설치 패키지 deb 파일을 파일질라로 서버에 올리고 설치합니다.
dpkg -i 명령어와 달리, apt i 명령어는 .deb 파일 의존성도 자동으로 설치됩니다.

파일 접근 권한 관련 에러 메시지

N: Download is performed unsandboxed as root as file '/home/ncloud/insatall/nginx_1.28.0-1~noble_amd64.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)

위와 같은 에러가 발생해도 Nginx 설치 및 동작에는 영향이 없으므로 무시해도 됩니다.

Nginx 설치 확인

nginx -v
또는
sudo systemctl status nginx

nginx 설치가 정상적으로 되었는지 확인할 수 있습니다.


Nginx 서버 실행 및 종료

Nginx 서버 실행

systemctl start nginx

Nginx 실행파일 위치 확인

which nginx

일반적으로 /usr/sbin/nginx 폴더에 nginx 실행파일이 저장됩니다.

nginx 기본 페이지 확인

curl -i http://localhost:80

현재 리눅스 서버에서 실행중인 Nginx에 HTTP 요청을 보내서 기본 HTML을 확인할 수 있습니다.

Nginx 서버 종료

systemctl stop nginx

Nginx 서버 자동시작 설정

systemctl enable nginx

Nginx 서버 자동시작 여부 확인

systemctl is-enabled nginx

enable라고 나오면 리눅스 서버 재기동 시 Nginx 서버도 자동시작됩니다.


Nginx 서버 설정

Nginx 설정파일 종류

/etc/nginx/nginx.conf Nginx 메인 설정 파일
Nginx 실행 시 가장 먼저 읽는 설정입니다.
/etc/nginx/conf.d/*.conf 공통 설정 또는 추가 서버 설정 파일
Ubuntu 보다는 CentOS 계열에서 주로 사용합니다.
해당 파일은 없어도 정상 동작합니다.
/etc/nginx/sites-available/도메인명 사이트별 가상호스트 설정 파일 (원본)
/etc/nginx/sites-enabled/도메인명 활성화된 사이트 설정 파일 (심볼릭 링크)
Nginx가 실제로 참조하는 파일입니다.

Ubuntu 계열 Nginx 디렉토리 구조입니다.

Nginx 메인 설정 파일 수정

vi /etc/nginx/nginx.conf

아래처럼, nginx.conf 파일 http 블록에 활성화된 사이트 설정 파일 폴더 include를 추가합니다.

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /run/nginx.pid;

events {
  worker_connections  1024;
}

http {
  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" "$http_x_forwarded_for"';

  access_log  /var/log/nginx/access.log  main;

  sendfile        on;
  #tcp_nopush     on;

  keepalive_timeout  65;

  #gzip  on;

  include /etc/nginx/conf.d/*.conf;
  include /etc/nginx/sites-enabled/*;
}

sites-enabled 폴더가 실제 사이트별 설정 파일이 위치하는 곳입니다.

기본 서버 블록 삭제

cd /etc/nginx/conf.d
rm -rf default.conf

nginx 설치 시 자동으로 생성되는 기본 서버 블록을 삭제합니다.
curl localhost:80 시 Nginx welcom 페이지가 나오도록 설정된 파일입니다.

사이트별 설정 파일 폴더 생성

mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled

nginx 설치 시 위 폴더들이 생성되지 않은 경우, 직접 생성해 줍니다.

사이트별 설정 파일 작성

cd /etc/nginx/sites-available
vi Vue서버도메인명.co.kr

Vue 사이트 Nginx 설정을 아래와 같이 작성합니다.

server {
  # 서버에서 받을 요청 설정
  listen 80; # 생략 가능 (기본값 : 80)
  server_name localhost Vue서버도메인명.co.kr; # 생략 가능, 여러 도메인 처리 가능

  # Vue.js 정적 파일 서빙 설정
  root /var/www/프로젝트명_current;
  index index.html;

  # 모든 경로 요청이 index.html로 넘어가 Vue 라우터가 처리
  location / {
      try_files $uri $uri/ /index.html;
  }

  # 백엔드 서버 프록시 설정
  location /api/ { # 현재 서버 URL 뒤 /api/ 요청이 들어오면,
    proxy_pass http://127.0.0.1:8087; # 현재 서버에 8087 포트로 실행 중인 스프링부트 백엔드 서버로 연결
    proxy_redirect off;
    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;
    proxy_set_header X-NginX-Proxy true;
    client_max_body_size 10m;
  }

  # 웹소켓 백엔드 서버 프록시 설정
  location /socket.io/ { # 현재 서버 URL 뒤 /socket.io/ 요청이 들어오면,
    proxy_pass https://프로젝트명-websocket.도메인명.co.kr:8082; # 웹소켓 서버용 도메인으로 연결 (로드밸런서로 이중화)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_redirect off;

    proxy_buffers 8 32k;
    proxy_buffer_size 64k;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
  }
}

Nginx 기본 웹 루트 폴더 /var/www/html는 다른 폴더로 변경이 가능합니다.
‘root /var/www/프로젝트명_current’으로 작성하면 됩니다.

server_name이 없는 서버 블록은 default 서버 블록으로 취급됩니다.
클라이언트 요청 시 Host 헤더가 server_name과 매칭되는 서버 블록이 없으면,
Nginx는 default 서버 블록으로 요청을 처리합니다.

Nginx 전체 서버 블록 확인 방법

sudo nginx -T | grep -A 10 server

현재 Nginx에 적용된 서버 블록 목록을 확인해볼 수 있습니다.

사이트별 설정 파일 복사 (활성화)

cp Vue서버도메인명.co.kr /etc/nginx/sites-enabled 

sites-available 폴더에 작성한 파일을 sites-enabled 폴더에도 복사합니다.
심볼릭 링크 방식이 보안 조치로 막히는 운영서버에서는 파일 복사하여 사용해야 합니다.

심볼릭 링크 방식 사용 시

ln -s /etc/nginx/sites-available/Vue서버도메인명.co.kr /etc/nginx/sites-enabled/

위와 같이, 원본 파일을 가리키는 심볼릭 링크를 sites-enabled 폴더에 생성하면 됩니다.

Nginx 설정 적용

sudo systemctl reload nginx

리눅스 서비스 매니저 systemd를 통해 현재 실행 중인 Nginx 서비스에 reload 명령을 전달합니다.
이제 Vue 프로젝트를 배포하면, http://서버도메인또는IP 접속 시 Vue 앱이 나오게 됩니다.

Nginx 설정 문법 정상 확인

sudo nginx -t

아래와 같은 메시지가 나오면, Nginx 설정 파일이 정상적으로 작성된 것입니다.

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

Vue 프로젝트 빌드 및 배포 방법

Vue 프로젝트 빌드 스크립트 작성

"scripts": {
  "build": "vite build",
  "dev-build": "vite build --mode development",
}

Vue 프로젝트 package.json 파일 스크립트에 위와 같이 운영 빌드, 개발 빌드 스크립트를 작성합니다.
mode 옵션은 빌드 시 사용할 환경변수 .env 파일을 지정하는 용도입니다.
mode를 지정하지 않으면, production 모드로 자동 설정됩니다.

Vue 프로젝트 빌드 명령어

npm run build(스크립트명)

프로젝트 빌드 시 .vue 파일들이 정적 HTML, JS, CSS 파일로 변환되어 dist 폴더에 생성됩니다.
적용된 .env 파일 환경변수 값은 import 된 JS 소스에서 확인할 수 있습니다.

dist 폴더 압축 후 서버 업로드

로컬에서 dist 폴더를 zip 파일로 압축 후, 파일질라로 리눅스 서버에 올립니다.

dist 폴더 압축 해제

cd /파일업로드경로
unzip dist.zip -d /var/www/프로젝트명_v버전명

위 명령어로 압축을 해제하여 신규 배포 폴더를 생성합니다.
-d 옵션으로 지정한 폴더가 없으면 자동 생성됩니다.

심볼릭 링크 생성 및 교체

ln -sfn /var/www/프로젝트명_v버전명 /var/www/프로젝트명_current

웹 루트 폴더로 접근하면 실제 파일이 있는 폴더로 연결되는 심볼릭 링크를 생성합니다.
fn 옵션으로 인해 같은 이름의 심볼릭링크가 있으면 덮어쓰기 됩니다.

Nginx 설정 재적용 및 워커 재로드

sudo nginx -s reload

Nginx는 웹 루트로 설정된 심볼릭 링크 경로를 계속 참조하므로, Nginx 재시작 없이도 신규 소스가 반영됩니다.
그러나, Nginx 워커가 이미 열고 있는 파일도 최신 파일로 반영하려면 reload 하는 것이 좋습니다.
Nginx 마스터 프로세스가 설정 파일을 다시 읽고, 새로운 워커 프로세스가 띄워집니다.
기존 워커가 기존 연결을 모두 처리한 뒤 종료되므로 사용자 접속 끊김이 거의 없는 방식입니다.

기존 배포 폴더 삭제

cd /var/www
rm -rf 프로젝트명_v기존버전명

신규 배포 후 안정화 기간이 지나도 문제가 없는 경우, 기존 배포 폴더는 삭제하는 것이 권장됩니다.