본문 바로가기

공부방/Nginx

Nginx config 설정

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