1.서버 사양 확인
참고 링크
http://bahndal.egloos.com/581863
[step1] cpu 확인
less /proc/cpuinfo
[step2] cpu 코어 확인
nproc
[step3] 메모리 확인
free -h
2. 리눅스 최적화 세팅
[Step1] limit.conf 설정
리눅스는 /etc/security/limit.conf 파일을 통해 서버의 리소스를 관리함
참고 링크
https://wasking.tistory.com/92
https://www.burndogfather.com/190
ulimit는 프로세스의 자원 한도를 설정 및 확인하는 명령(limit.conf)에서 읽어온다. soft / hard 두가지 제한으로 나뉨
soft : 새로운 프로그램을 생성하면 기본으로 적용되는 한도
hard : 최대로 늘릴 수 있는 한도
# ulimit -a // Soft 설정 보기
# ulimit -aH // Hard 설정 보기
통상적으로 soft와 hard를 1:1로 맞추어 설정
limit.conf의 내용은 주로 아래와 같이 구성
testuser soft nofile 65535
testuser hard nofile 65535
testuser soft nproc 65535
testuser hard nproc 65535
nproc (number of processes) : 프로세스 최대 개수
nofile (number of open files) : 파일 열기 최대 개수
리눅스에서는 모든 개체를 파일로 보기에 nproc를 높이면 nofile도 같이 높여주는 것이 맞다.
● 계정당 생성한 프로세스 개수
# ps h -Led -o user | sort | uniq -c | sort -n
● 계정의 오픈한 파일 개수
# lsof -u [username] | wc -l
# sysctl -a |grep file-nr
아래 파일에 접근
vi /etc/security/limits.conf
아래 옵션 추가
* soft nofile 65535
* hard nofile 65535
nofile 옵션을 너무 높게 줘도 좋지 않다고 함 (참고3)
comms-search는 nofile 옵션을 655350으로 설정 하였지만,
comms-ada 서버는 cpu, ram 성능도 다를 뿐만 아니라, 역할도 다르기 때문에 동일하게 설정할 필요가 없다고 판단하여
65535로 설정함.
3. Nginx 설정 (nginx.conf)
nginx를 설치하면 초기에 설정된 nginx.conf와 default.conf 파일을 확인할 수 있다.
nginx의 기본 설정 파일 ( /etc/nginx/nginx.conf ) 옵션을 확인해보자.
user nginx; ## NGINX 프로세스가 실행되는 권한, root 권한은 보안상 위험함
worker_processes auto; ## CPU 코어 하나에 최소한 한 개의 프로세스가 배정되도록 변경 권장
# 로그레벨 [ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log notice; ## 로그레벨을 notice -> warn로 변경함
pid /var/run/nginx.pid;
events {
worker_connections 2048; ## Default: 1024 -> 2048로 변경, comms-search는 10240으로 되어있음
}
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; ## 접속 시 커넥션 유지 시간, comms-search는 10초로 되어있음
#gzip on;
## ----------------------------------------------------------------
## 아래 부터는 comms-search 설정임.
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# copies data between one FD and other from within the kernel
# faster than read() + write()
sendfile on;
# send headers in one piece, it is better than sending them one by one
tcp_nopush on;
# don't buffer data sent, good for small data bursts in real time
tcp_nodelay on;
# reduce the data that needs to be sent over network -- for testing environment
gzip on; ## 전송 내용을 gzip으로 압축, 텍스트 컨텐츠는 gzip 압축으로 전송해야 성능이 좋다
# gzip_static on; ## 정적 파일을 미리 gzip으로 압축해 두면 압축 프로세싱 과정 없이 즉시 해당 압축파일을 전송한다, 예를들어 test.js 파일에 대한 요청이 올 경우 test.js.gz 를 찾아서 해당 파일이 존재하면 압축된 버전을 전송하고 없으면 원본 파일을 압축한 뒤에 전송한다. CPU 점유율이 낮아지고 성능이 향상된다.
gzip_min_length 10240;
gzip_comp_level 1;
gzip_vary on;
gzip_disable msie6;
gzip_proxied expired no-cache no-store private auth;
gzip_types
# text/html is always compressed by HttpGzipModule
text/css
text/javascript
text/xml
text/plain
text/x-component
application/javascript
application/x-javascript
application/json
application/xml
application/rss+xml
application/atom+xml
font/truetype
font/opentype
application/vnd.ms-fontobject
image/svg+xml;
client_header_buffer_size 128k;
include /etc/nginx/conf.d/*.conf;
}
[step1] Nginx CPU관련 튜닝 설정
참고 링크
https://couplewith.tistory.com/entry/%EA%BF%80%ED%8C%81%EA%B3%A0%EC%84%B1%EB%8A%A5-Nginx%EB%A5%BC%EC%9C%84%ED%95%9C-%ED%8A%9C%EB%8B%9D4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EB%B0%8F-CPU-%ED%8A%9C%EB%8B%9D%ED%95%98%EA%B8%B0-Processor
1. worker_processes
워크 프로세스는 유입되는 이벤트를 처리하는 프로세스로 CPU 코어수 만큼 프로세스를 기동하는 것을 권장
"auto"나 cpu core 수 만큼 설정. "auto"로 설정을 하면 자동으로 알아서 설정하므로 정확한 cpu 코어수에 맞추지 않아도 됨.
2. worker_rlimit_nofile
작업 프로세스가 최대 열 수 있는 파일 수에 대한 제한을 설정하여 처리량을 늘려줌
3. worker_connections:
작업자 프로세스에서 열 수 있는 최대 동시 연결 수를 설정
보통 cpu 코어수 * 1024 정도를 권장
하나의 cpu코어가 처리할 수 있는 양을 고려하여 적절한 숫자를 입력하면 됨.
[step 2] 압축 설정
참고 링크
https://www.lesstif.com/system-admin/nginx-gzip-59343019.html
https://twpower.github.io/48-set-up-gzip-in-nginx
http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_proxied
- gzip on: 전송 내용을 gzip으로 압축, 텍스트 컨텐츠는 gzip 압축으로 전송해야 성능이 좋다
- gzip_static on: 정적 파일을 미리 gzip으로 압축해 두면 압축 프로세싱 과정 없이 즉시 해당 압축파일을 전송한다, 예를들어 test.js 파일에 대한 요청이 올 경우 test.js.gz 를 찾아서 해당 파일이 존재하면 압축된 버전을 전송하고 없으면 원본 파일을 압축한 뒤에 전송한다. CPU 점유율이 낮아지고 성능이 향상된다.
- gzip_comp_level : 1 ~ 9까지 설정할 수 있으며 숫자가 클수록 압축율은 올라가지만 압축 속도는 느려집니다.
- gzip_min_length: 압축을 적용할 컨텐츠의 최소 사이즈를 지정하며 이보다 작은 파일은 압축하지 않습니다.
- gzip_buffers : 버퍼의 숫자와 크기를 지정하며 16은 버퍼의 숫자, 8k 는 크기입니다.
- gzip_proxied : proxy 나 캐시 서버에서 요청할 경우 동작 여부를 설정합니다. proxy 여부는 Via 헤더의 존재 여부로 확인하며 다음과 같은 설정이 가능합니다.
- off: 프락시에서 요청할 경우 압축하지 않습니다.
- expired: 요청 헤더에 Expires 가 있고 만료되었을 경우에만 압축합니다.
- no-cache: 요청 헤더에 Cache-Control 가 있고 no-cache 일 경우에만 압축합니다.
- no-store: 요청 헤더에 Cache-Control 가 있고 no-store 일 경우에만 압축합니다.
- any: 항상 압축합니다.
- auth: 요청 헤더에 Authorization 가 있을 경우 압축
- private: 요청 헤더에 Cache-Control 가 있고 private 일 경우에만 압축합니다.
- gzip_vary on: gzip, gzip_static, or gunzip의 설정들이 on으로 되어있을 때 응답 헤더에 “Vary: Accept-Encoding”를 넣을지 말지에 대한 명령어 입니다.
- gzip_disable msie6: gzip_disable 에는 압축을 적용하지 않을 브라우저를 지정하며 예전 IE 는 압축을 지원하지 않으므로 msie6 는 예외 항목으로 설정합니다.
[step 3] tcp 설정
조금 더 확인해 봐야함.
참고
https://deeplify.dev/server/web/nginx-configuration
- sendfile on: 하드디스크io처리와 socket-io처리의 밸런스를 얻기위해 on으로 해주세요 *뭔소리지..
- tcp_nopush: 하나의 데이터 패키지에 모든 헤더 정보가 포함되다 *뭔소리지..
- tcp_nodelay: 데이터를 캐쉬하지 않고 계속 송신시킨다. 리얼타임에 최적 *캐쉬하면 어떻게 동작하는거지?
- keepalive_timeout: 클라이언트에서 해당 서버로 keepalive 커넥션을 유지할 수 있는 시간을 설정합니다. 너무 길면 요청이 없는 클라이언트와의 커넥션을 연결하고 있기 때문에 자원의 낭비가 발생한다.
- open_file_cache max=200000 inactive=20s:
- open_file_cache_valid 30s:
- open_file_cache_min_uses 2:
- open_file_cache_errors on:
4. Nginx 설정 (default.conf)
default.conf는 nginx.conf를 통해 include된 서버 설정관련 파일이다. default2.conf, default3.conf 등 여러 개의 파일을 추가하여 서버관련 설정을 추가로 만들어 포함시킬 수 있다.
upstream comms-ada {
server 127.0.0.1:8080 fail_timeout=20s;
}
server {
listen 80;
server_name 도메인 주소;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
proxy_pass http://comms-ada;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
server {
listen 443 ssl;
server_name ada.coolmessenger.com;
access_log /var/log/nginx/search.coolmessenger.com.ssl.log main;
error_log /var/log/nginx/search.coolmessenger.com.ssl.log debug;
ssl_certificate /etc/nginx/conf.d/ssl/2022/Wildcard.coolmessenger.com_pem.pem;
ssl_certificate_key /etc/nginx/conf.d/ssl/2022/KeyFile_Wildcard.coolmessenger.com_pem.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED;
location / {
proxy_pass http://comms-ada;
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;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_redirect off;
}
#error_page 403 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
- listen 443 ssl;
- server_name 도메인 주소
- access_log /var/log/nginx/search.coolmessenger.com.ssl.log main;
- error_log /var/log/nginx/search.coolmessenger.com.ssl.log debug;
- ssl_certificate : 공개키 경로;
- ssl_certificate_key : 개인키 경로;
- ssl_protocols : TLSv1 TLSv1.1 TLSv1.2;
- proxy_pass http://search;
- 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;
- proxy_set_header Upgrade $http_upgrade;
- proxy_set_header Connection "upgrade";
- proxy_http_version 1.1;
참고
https://yangbongsoo.tistory.com/12
원문 참고 : nginx.org/en/docs/http/ngx_http_core_module.html
원문 참고 : nginx.org/en/docs/http/ngx_http_proxy_module.html
- proxy_read_timeout: proxied server 로부터 응답을 읽는데 설정한 timeout 시간이다. 전체 응답 전송 timeout 시간이 아니라 두개의 연속적인 읽기 작업 사이의 timeout 시간이다. proxy_read_timeout에 지정한 시간안에 proxied server가 아무것도 전송하지 않으면 connection은 닫힌다. 디폴트 값은 60초이다.;
- proxy_connect_timeout: proxied server로 요청을 전송하는데 설정한 timeout 시간이다. 전체 request 전송 timeout 시간이 아니라 두개의 연속적인 쓰기 작업 사이의 timeout 시간이다. proxy_send_timeout에 지정한 시간안에 proxied server가 아무것도 받지 못하면 connection은 닫힌다. 디폴트 값은 60초이다.;
- proxy_redirect off;
'공부방 > Nginx' 카테고리의 다른 글
발표자료 (0) | 2023.04.02 |
---|---|
Nginx vs apache (0) | 2023.04.02 |
노드 설치 (0) | 2023.03.21 |
Tomcat 설정 (0) | 2023.01.17 |
Nginx, Tomcat, War (0) | 2023.01.12 |