nginx.conf의 파일을 바꿔줬지만 동시 트래픽을 감당하기 위해서는 여러 상황을 고려해봐야한다.
nginx 설정 이후 성능 테스트를 해본 결과 동시 접속자 수를 늘려보면 에러율이 꽤 높게 발생하였다...
필자는 성능 테스트 툴 중에 Apache Jmeter를 사용했다.
사용방법은 블로그에 정리해두었으니 보고 참고해도 좋다.
JMeter사용법
이 문제점은 Nginx 자체 문제가 아니라 클라우드 컴퓨터 스펙 문제이기 때문에 자신의 클라우드 컴퓨터 스펙에 대한 이해와 개발 환경에 대한 이해가 필요하다.
필자의 개발 환경
- CPU Core 2개, RAM 4G 컴퓨터를 서버로 사용
- DB: mariaDB
- API 개발 환경: Node.js
여기서 connectionLimit이 중요하다!
해당 설정은 MariaDB에서 동시에 처리하고자 허용하는 요청의 개수를 뜻한다.
사진에는 300이지만 필자는 500으로 정해주었다.
그렇게 되면 동시에 500개까지 Connection을 할 수 있게 된다.
API서버에서 DB에 SQL질의를 할 때마다 열리는 것이 Connection이다.
SQL질의를 할 때 1개씩 사용된다.
이를 이해하기 위해서 Pool이란 것을 이해해야한다.
Pool은 Node와 MariaDB가 연결되는 방식인데
이 Pool은 각 Connection을 담고 있는 공간으로 볼 수 있다.
let conn;
try {
conn = await mariadb.getConnection(); //pool connection
const query = `SELECT * FROM persons`;
const result = await conn.query(query);
return result;
} catch (err) {
throw err;
} finally {
conn?.release(); // connection => pool
}
질의 SQL문을 만든다면 이렇게 만들게 될텐데 pool을 Connection했다면 끝날 때 release()를 해줘야한다.
반환 하지 않게 된다면 사용가능한 Connection이 -1개로 줄어들게 된다. 그래서 모든 SQL 질의에서 release()를 해줘야 한다.
그리고 Nginx의 설정이 mariadb보다 높게 되어 있다면 Too many connections 이슈를 보고 설정을 바꿔보자
데이터의 흐름
client => Nginx => WAS(node.js) => DB (MySQL)
Node와 MySQL이 500개의 요청을 처리할 수 있도록 했으니 앞단인 Nginx에서도 500개를 처리할 수 있도록 해야한다.
설정 파일 들어가기
nano /etc/nginx/nginx.conf
worker_connections 값 변경
✨ 최대 접속자 수 = worker_processes * worker_connections
이렇게 되면 동시 요청시 문제없이 처리할 수 있게 된다.