모바일 & 앱

node.js를 이용한 분산 소켓 서버 : #2 centos7에 Nginx 설치

Hippalus 2024. 6. 30. 20:11
반응형

1. yum 외부 저장소 추가
cd /etc/yum.repos.d
ls를 실행해보면 yum 저장소에는 nginx가 없다.

따라서 vi에디터로 /etc/yum.repos.d에 nginx.repo 파일을 생성 후 아래 스크립트를 복사 붙여넣기 한다. 

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1

ESC :wq로 저장 후 나와준다.

*참고
baseurl에 centos/7로 되어 있는데 만약 centos가 8이면 8을 입력하면 된다.
(OS버전 확인 방법은 cat /etc/centos-release)
그리고 gpgcheck 옵션은 리포지토리에서 받은 패키지들의 GPG( GNU Privacy Guard) 서명을 확인할지 여부를 나타내는데 0으로 설정하면 서명을 확인하지 않고 패키지를 설치하게 되는데 무결성 보장, 신뢰성, 보안 취약성 등의 문제가 있을 수도 있으니 그냥 1로 하자.

enabled 활성화된 리포지토리에서 패키지를 설치할 수 있게 해주는 옵션이다.
 

2. yum install
yum install -y nginx
설치 과정에서 Public key for nginx-1.26.0-1.el7.ngx.x86_64.rpm is not installed 라며 제대로 설치가 안 될 경우
RPM 패키지가 서명되었지만 시스템에 해당 서명 키가 설치되어 있지 않아 발생하는 것으로 해결 방법은 해당 패키지에 대한 GPG 키를 가져와서 시스템에 추가한 후 다시 yum install -y nginx를 실행하면 된다.
rpm --import https://nginx.org/keys/nginx_signing.key

 



3.nginx.conf 수정
vi 명령어로 vi /etc/nginx/nginx.conf 파일을 수정한다.
* 내 경우 소스로 업체에서 설치를 해뒀는지 vi /usr/local/nginx/conf/nginx.conf로 수정해야 했다.


열어보면 이상한 설정들이 존재하는데


눈여겨 볼 곳은 이곳 부터다.
worker_processes auto;

events {
    worker_connections 1024;
}
프로세서의 코어수 만큼 연결 처리를 1024개를 자동으로 감지해서 설정해주는 부분인데
논리적으로야 코어가 16코어면 16 X 1024개니 어마어마하다.
하지만 실제 그만큼 처리 가능할리는 만무하니 이정도로만 알고 지나가겠다.

로드밸런싱을 위해 옵션을 주면 접속한 클라이언트들을 적절히 배분해준다.
ip_hash가 일반적으로 사용되지만 내 경우 모두 동일한 IP이므로 정상 동작하지 않을것이다.
따라서 아래 두개 중 least_conn을 적용했다.

다음은 upstream설정이다.
몇개의 서버 프로세스를 실행시킬지에 대한 설정인데 upstream다음에 적당한 이름을 지어주면 된다.
나는 클라이언트가 접속할 포트로 8984를 이용하고, 접속 후 생성된 서버 프로그램용으로 총 3개의 소켓 서버를 사용할 생각이므로 8985 부터 8987까지 추가해뒀다.
물리적 서버도 분리하면 더 많은 클라이언트 처리가 가능하겠지만
node.js 싱글스레드 방식이므로 하나의 local서버에서 포트만 달리 구성해도 나름 효과적이다.

upstream의 이름을 난 그냥 node_app이라 지었고

  upstream node_app {
    least_conn
    server 127.0.0.1:8985;  # 첫 번째 Node.js 인스턴스
    server 127.0.0.1:8986;  # 두 번째 Node.js 인스턴스
    server 127.0.0.1:8987;  # 세 번째 Node.js 인스턴스
    # 필요에 따라 더 많은 인스턴스를 추가
  }
그리고 로드밸런싱을 어떤 방식으로 할지 적어주면 되는데 
아래 4가지 중 하나를 선택하면 된다.
난 현재 연결 수가 가장 적은 서버로 연결되는 방식인 least_conn 방식을 선택했다.

least_conn: 현재 연결 수가 가장 적은 서버로 요청
round_robin (기본값): 순차적으로 각 서버에 요청
ip_hash : 해시값이 3이고 서버가 5개 있다면, 3 % 5 = 3 이므로 4번째 서버(0부터 시작하므로)가 선택
least_time : 요청을 처리하는 데 걸리는 시간에 기반하여 서버를 선택하며 least_time header 또는 least_time last_byte 옵션으로 사용

같은 서버에 port 번호만 다르게 해서 실행할거니 server 127.0.0.1 그리고 포트 번호를 적어줬다.


다음은 추가한 upstream을 호출하는 부분이다.
http를 사용한다면 그냥 80쪽에 추가하면 되지만
server {
     listen 80;
     listen 8984;
}

https(SSL)을 사용하여 통신하겠다면 listen 443 ssl아래에 아래처럼 소켓 클라이언트가 접속할 포트를 추가해주면 되겠다.
내가 지정한 포트는 8984다.

  server {
        listen 443 ssl;
        listen 8984 ssl;
        ...
        이하 ssl 구성 (pem, cache, protocols TLS...등등) 생략
        ...
  }

이제 가장 중요한 /socket.io 설정 부분이다.
이부분 때문에 좀 헤맸다.
proxy_pass : 앞서 upstream으로 분산처리를 하였는데 이 upstream이름을 적어주면 된다.
limit_conn conn_limit_per_ip : 클라이언트가 몇개 이상 접속하게 되면 자동으로 차단하여 서버를 보호할 것이다. 난 테스트 해보니 8000개까지 처리 가능하였다.
다른 설정들은 그냥 복사하면 그만이다.

    location /socket.io/ {
      limit_conn conn_limit_per_ip 8000;

      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $host;

      proxy_pass http://backsvr;
      proxy_set_header X-Server-Name $upstream_addr;

      # enable WebSockets
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }


추가된 결과



4. Nginx 재시작 하여 설정 변경 사항 적용
Nginx가 설치된 위치는 내 경우 /usr/sbin아래이므로
/usr/sbin/nginx -s reload

여기까지 Nginx 준비는 끝이다.

실행 : systemctl start nginx
중지 : systemctl stop nginx
재시작 : systemctl restart nginx
상태 : systemctl status nginx

추가로 만약 nginx 실행 문제가 발생할 경우 확인하는 방법을 설명하자면
만약 path가 없어서 nginx -t명령어 실행이 불가능할 경우
whereis nginx 으로 nginx가 어디에 설치되어 있는지 확인하고 (보통 /usr/sbin 폴더에 있다.)

수정된 conf파일 검사 : /usr/local/nginx/sbin/nginx -t

수정 후 nginx 중지 : /usr/local/nginx/sbin/nginx -s stop
수정 후 nginx 실행 : /usr/local/nginx/sbin/nginx

이 순서대로 진행하면 된다.


반응형