Skip to content

nodejs + nginx reverse proxy

조회 수 11 추천 수 0

ubuntu 기준입니다.

8080 포트 열어주어야 합니다.

테스트: http://주소:8080/socket.io/socket.io.min.js

sudo apt update
sudo apt install nginx build-essential python3 make g++ pkg-config

1) systemctl edit nginx

[Service]
LimitNOFILE=65535

2) vi /etc/nginx/nginx.conf

user www-data;                          # 기본 값.
pid /run/nginx.pid;               # 기본 값.
worker_processes auto;                  # 기본 값, 필요하면 늘림.

include /etc/nginx/modules-enabled/*.conf;  # 기본 값

events {
    use epoll;
    worker_connections 20000;
}

# PCRE JIT (정규식 성능)
pcre_jit on;

# 파일/소켓 수 상한
worker_rlimit_nofile 65535;

http {
    # WebSocket Upgrade 헤더 처리용 (sites-enabled include보다 먼저!)
    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server_tokens off;                  # 선택 사항

    include /etc/nginx/mime.types;      # 기본
    default_type application/octet-stream;

    sendfile on;                        # 기본
    tcp_nopush on;                      # 기본
    tcp_nodelay on;
    types_hash_max_size 2048;           # 기본

    keepalive_timeout 65;               # 채팅/WebSocket

    # reverse proxy 공통 타임아웃(웹소켓/롱커넥션 대비)
    proxy_http_version 1.1;             # Node/WebSocket에 유리
    proxy_connect_timeout 5s;
    proxy_send_timeout 3600s;
    proxy_read_timeout 3600s;

    send_timeout 60s;
    client_max_body_size 10m;           # (선택)

    include /etc/nginx/conf.d/*.conf;       # 기본
    include /etc/nginx/sites-enabled/*.conf; # 확장자 conf 만 로딩 (선택)

    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 5;
    gzip_min_length 1024;
    gzip_types
        text/plain
        text/css
        application/json
        application/javascript
        text/xml
        application/xml
        application/xml+rss
        text/javascript;
}

3) vi /etc/nginx/sites-enabled/chat.elkha.kr.conf

upstream node_chat {
    server 127.0.0.1:8082;
    keepalive 64;
}

server {
    listen 0.0.0.0:8080;
    server_name _;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    proxy_set_header Host $http_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_connect_timeout 5s;
    proxy_send_timeout 3600s;
    proxy_read_timeout 3600s;

    proxy_buffering off;
    proxy_request_buffering off;

    location / {
        proxy_pass http://node_chat;
    }

    location ~* \.map$ { return 204; }
}

nodejs (root 아니어도 됨)

# 1) nvm 설치
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash

# 2) 현재 쉘에 nvm 로드 (터미널 재실행해도 됨)
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

# 3) Node.js 24 설치/사용
nvm install 24
nvm use 24
nvm alias default 24

# 4) PM2 설치
npm i -g pm2

# 5) 확인
node -v
pm2 -v

cd elkhatalk

npm install
pm2 start app.js --name elkhatalk --max-memory-restart 1024M
pm2 startup systemd -u elkha --hp /home/elkha
# 위 명령이 출력하는 sudo 1줄을 그대로 실행
pm2 save
개발자