웹 서버란?
팀 버너스 리가 구축한 월드 와이드 웹(WWW)은 인터넷 네트워크에서 동작하는 프로토콜입니다. 인터넷에서는 클라이언트가 웹 서버에게 요청을 보내고 연결은 HTTP 프로토콜로 연결이 확립된 후 데이터가 전송됩니다.
클라이언트는 쉽게 말해 정보를 요청하는 쪽이고, 서버는 정보를 전달해주는 역할을 담당합니다. 서버 컴퓨터라고 따로 있는게 아니라 우리가 일반적으로 사용하는 PC도 서버로써의 동작을 할 수 있습니다. 대표적으로 개발을 할 때 많이 사용하는 localhost가 웹 서버가 될 수 있습니다.
웹 서버의 큰 특징 중 2가지는 우선 정적 리소스를 반환해주는 기능입니다. HTML, CSS와 같이 동적으로 변하는 데이터가 아닌 데이터들을 반환해줍니다.
두번째 역할은 프록시 기능입니다.
구글과 같이 트래픽이 엄청난 서비스들은 어떻게 서버를 구축할까요? 우리가 실제 요청을 보내는 서버로 클라이언트가 바로 요청을 보내는것이 아니라 중간에 트래픽을 분산시켜주는 로드밸런서 역할을 하는 프록시 서버가 미들웨어로 작동합니다. 이 기능을 웹 서버가 담당합니다.
웹 서버가 되기 위해서는 서버로써의 역할을 할 수 있도록 지원하는 프로그램이 필요한데, 이중 하나가 Apache, Nginx가 되는 것입니다. 2022년 웹 서버 점유율을 보면 아직까지도 Apache의 아성을 이길 수는 없지만, Nginx도 꾸준히 점유율을 늘려가는 모습입니다.
Apache VS Nginx
Apache는 1996년에 등장한 웹 서버 프로그램입니다. 오픈소스로 배포되었고, 웹이 뜨기 시작한 이래로 단 한번도 웹 시장 점유율 1위를 내준적이 없습니다. 반면 Nginx는 차세대 웹 서버로 사용되지 않는 기능은 과감히 내다 버리고, 보다 적은 리소스를 가지고 웹 서버의 기능을 구현해 내고 있습니다.
Nginx 환경 구성하기
Nginx를 프로젝트에 적용하기 위해서는 conf 파일을 구성해야 합니다. 이 파일에 프록시를 정하고 정적 파일은 어떤걸 보내줄지 결정할 수 있습니다. 즉 Nginx가 어떻게 작동해야 할지를 명시하는 기술 명세서라고 생각하시면 됩니다. Nginx 설정파일은 대략 4개정도 구성됩니다.
Nginx 구성 파일
- default.conf : 메인 설정 파일
- fcgi.conf : FastCGI 환경 설정 파일
- sites-enabled : Apache의 Virtual Host 설정 영역입니다. Optional 한 파일이지만 활성화된 사이트들의 설정 파일들을 명시합니다.
- sites-avalable : 비활성화된 사이트들을 명시하는 파일입니다.
nginx.conf 파일
user www www;
worker_processes 2;
pid /var/run/nginx.pid;
# [ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx.error_log info;
events {
worker_connections 2000;
# use [ kqueue | rtsig | epoll | /dev/poll | select | poll ] ;
use kqueue;
}
http {
include conf/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
output_buffers 1 32k;
postpone_output 1460;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
send_lowat 12000;
keepalive_timeout 75 20;
# lingering_time 30;
# lingering_timeout 10;
# reset_timedout_connection on;
server {
listen one.example.com;
server_name one.example.com www.one.example.com;
access_log /var/log/nginx.access_log main;
location / {
proxy_pass http://127.0.0.1/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
client_body_temp_path /var/nginx/client_body_temp;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_send_lowat 12000;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path /var/nginx/proxy_temp;
charset koi8-r;
}
error_page 404 /404.html;
location /404.html {
root /spool/www;
charset on;
source_charset koi8-r;
}
location /old_stuff/ {
rewrite ^/old_stuff/(.*)$ /new_stuff/$1 permanent;
}
location /download/ {
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
#rewrite ^/ http://www.example.com/;
return 403;
}
# rewrite_log on;
# rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3
rewrite ^/(download/.*)/mp3/(.*)\..*$ /$1/mp3/$2.mp3 break;
root /spool/www;
# autoindex on;
access_log /var/log/nginx-download.access_log download;
}
location ~* ^.+\.(jpg|jpeg|gif)$ {
root /spool/www;
access_log off;
expires 30d;
}
}
}
Nginx conf 파일은 위와 같이 생겼습니다. 길이가 길어서 당황스럽지만, 하나하나 뜯어보면서 설정하고자 하는 부분을 잘 적어주시면 됩니다.
① Simple directives
최상단에는 멀티 코어로 작동할 worker의 갯수와 사용자의 이름 등을 기록합니다. 이를 Simple Directives라고 합니다. Nginx conf 파일은 무조건 세미콜론(;)으로 마무리를 해줘야 합니다.
- user : 어떤 유저가 Nginx를 작동할지 명시합니다.
- worker_processes : 몇개의 쓰레드가 작동할지 명시합니다. 갯수는 CPU 코어 갯수만큼만 사용하길 권장드립니다.
- pid : Nginx pid(process Id)가 적힙니다.
- include : 외부에서 작성한 conf 파일 내용을 가져옵니다.
② Block Directives
{} 안에 Ngnix 웹 서버가 동작할 서버와 로케이션, 이벤트, 프록시 설정등을 기록합니다.
events
이벤트에는 worker process 당 몇개의 connection을 처리할지 정합니다.
Include
Nginx가 설치되면 /etc/nginx/conf.d 폴더안에 conf 파일이 저장됩니다. include를 사용하면 기존에 저장한 파일 내용을 가져와서 conf 파일에서 사용할 수 있습니다.
Context
conf 파일의 Directive안에 또 다른 Directive가 들어있는 것을 Context라고 합니다.
http
http Directive 안에는 특정 도메인 혹은 IP 주소로 요청을 분기해서 처리합니다. server Directive는 가상 서버를 설정하는 부분입니다. server > location은 사용자가 보내는 URL을 어떻게 분기할지 명시합니다.
location
사용자가 보내는 URL을 명시합니다.
upstream
현재 사용중인 서버 주소 목록을 관리합니다.
Nginx로 웹 서버 구성하기
1. 우선 upstream에서 운영중인 서버들을 관리합니다.
2. server Directives를 만들고 Location으로 사용자가 보내는 URL Path를 분기합니다.
3. Location에서는 URL 별로 Proxy Server를 운영할 수 있습니다.
- proxy_pass : 사용할 프록시 서버 주소를 기입합니다.
- proxy_connect_timeout : 프록시 연결 시간을 설정합니다.
- proxy_set_header : 프록시 서버의 헤더를 설정할 수 있습니다.
upstream client {
server 172.18.0.1:3010;
}
upstream api {
server 172.18.0.1:9192;
}
server {
location / {
proxy_pass http://client/;
}
location /api/ {
proxy_pass http://api;
}
}
SSL
만약 HTTPS 프로토콜을 프로젝트 붙인다고 하면 SSL / TLS 인증서가 필요합니다. Nginx에서 HTTPS 프로토콜을 사용하기 위해서는 conf 파일에 SSL 설정을 명시해줍니다.
# SSL
ssl on;
ssl_certificate /home/ubuntu/SSL/01/nginx_ssl.crt;
ssl_certificate_key /home/ubuntu/SSL/01/private.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
'Programming' 카테고리의 다른 글
Node.js 웹서버 배포 버전 만들기 production mode (1) | 2022.09.22 |
---|---|
Reverse Proxy VS Forward Proxy 차이점 (0) | 2022.09.20 |
bash: sudo: command not found 해결 (0) | 2022.09.20 |
Ubuntu Version 확인 명령어 (terminal 에서 버전 정보 체크 방법) (0) | 2022.09.19 |
AWS EC2 인스턴스 삭제 하는 방법 (0) | 2022.09.19 |
댓글