엔진엑스(Nginx) ( /ˌɛndʒɪnˈɛks/ EN-jin-EKS) (NGINX, NGiИX 또는 nginx으로 표기되기도 하는)는 역방향 프록시(reverse proxy), 로드 밸런서(load balancer), 메일 프록시(mail proxy) 및 HTTP 캐시(HTTP cache)로 역시 사용될 수 있는 웹 서버(web server)입니다. 이 소프트웨어는 이고르 시소에프(Igor Sysoev)에 의해 만들어졌으며 2004년 처음 공개되었습니다.
엔진엑스는 BSD-와 같은 라이선스 조건에 따라 배포되는 자유와 오픈-소스 소프트웨어(free and open-source software)입니다. 웹 서버의 상당수는 NGINX를 사용하고, 종종 로드 밸런서(load balancer)로 사용합니다.
같은 이름의 회사가 지원과 Nginx plus 유료 소프트웨어를 제공하기 위해 2011년에 설립되었습니다. 2019년 3월에, 그 회사는 F5, Inc.에 6억 7천만 달러에 인수되었습니다.
아파치와 같이 설치해서 운영해 보니, 이 서버에서, 대체적으로 엔진엑스가 좋은 성능을 보여줍니다. 물론 아파치에 비해 메모리를 아주 적게 사용하고, PHP를 사용할 때 좀 더 나은 성능을 보인다는 리뷰들이 많이 있습니다. 그러나, 아파치는 오랜 역사에 걸쳐 많은 도구들과 좋은 호환성을 가지는 특출난 장점이 있고, 여러 가지 상황을 고려해서 웹 서버는 선택되어야 할 것입니다.
2021년 1월 기준으로, Netcraft는 아파치가 백만 개의 가장 분주한 웹 사이트 중 24.63%를 서비스하고, 반면에 엔진엑스는 23.21% 및 마이크로소프트는 6.85%로 3위를 차지한 것으로 추정했습니다 (Netcraft의 다른 통계 중 일부에 대해, 엔진엑스가 아파치보다 앞서 있습니다). 반면에, W3Techs에 따르면, 아파치는 35.0%로 1위, 엔진엑스는 33.0%로 2위, Cloudflare Server는 17.3%로 3위입니다.
Installation
데비안 저장소에서 설치할 수 있습니다.
- sudo apt install nginx
또는 pagespeed modules을 이용하시려면, 다움 저장소를 추가하시거나, 아래에서 받을 수 있습니다:
Service check
엔진엑스 설치와 함께 서비스가 기동되고, 시스템 재시작 후에 자동으로 실행되도록 설정해 줍니다.
만약 수동으로 서비스를 확인, 시작, 중지, 자동 실행, 및 자동 실행 해제를 설정하고 싶으면, 다음과 같이 명령을 입력해야 합니다:
- sudo systemctl status nginx
- sudo systemctl start nginx
- sudo systemctl stop nginx
- sudo systemctl enable nginx
- sudo systemctl disable nginx
터미널에서 실제 서비스가 실행되고 있는지 확인하려면, 다음과 같이 입력해 봅니다.
- curl http://localhost
데스크탑 환경에서는 파이어폭스같은 웹브라우저를 열어서 주소창에 http://localhost 를 입력해서 확인할 수 있습니다.
Configuration
엔진엑스의 기본 설정은 /etc/nginx/nginx.conf 파일에 있습니다. 이 파일은 모든 가상 호스트에서 공통으로 사용할 설정을 기록하고, 추가적인 모듈에 대한 설정을 포함하고, 엔진엑스 최적화 설정 등을 포함할 수 있습니다.
또한, 가상 호스트 각각에 대한 설정을 sites-available 디렉토리에 별도로 저장해 두도록 설정되어 있습니다. 그런-다음 가상 호스트 파일에 대한 심볼릭 링크를 site-enabled에 만듦으로써, 해당 가상 호스트가 활성화됩니다.
예를 들어, default로 되어 있는 가상 호스트를 활성화하기 위해 다음과 같이 처리할 수 있습니다:
- sudo nano site-available/default
- cd site-enabled
- sudo ln -sf /etc/nginx/site-available/default .
- sudo nginx -t
- sudo systemctl restart nginx
PHP support
가상 호스트에서 PHP 지원을 사용하려면, 다음을 nginx 구성에 추가하십시오. 예를 들어, /etc/nginx/sites-available/default에 씁니다.
Server {
...
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}
...
}
Basic authentication
엔진엑스는 사용자 이름과 암호의 유효성을 검사하여 특정 위치 (여기서 /betterawstats)의 리소스에 대한 접근을 제한하는데, 예를 들어, /etc/nginx/sites-available/default에 씁니다.
server {
...
location /betterawstats {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/mypasswd;
}
...
}
예제에서 사용하는 mypasswd 파일은 다음과 같이 생성할 수 있습니다:
- sudo apt install apache2-utils
- sudo htpasswd -b -c /etc/nginx/mypasswd myusername 'mypassword'
여기서 mypasswd, myusername, mypassword를 적절히 바꾸십시오.
TLS support
주로 80 포트를 이용하는 http 대신에 https로 서비스하기 위해서는 설정에 있는 포트 80번을 주석 처리하고 443 포트를 열어주고, 인증서 파일의 위치를 지정해야 합니다.
server {
...
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
ssl_certificate /etc/ssl/certs/site.example.com.crt;
ssl_certificate_key /etc/ssl/private/site.example.com.key;
...
}
인증서 파일은 다음과 같이 직접 만들 수 있지만, 이 인증서는 보증해 주는 곳이 없기 때문에, 보통 브라우저에서 위험한 접근으로 분류됩니다. 외부에 공개하지 않고, 개인적으로 사용할 때 적용할 수 있는 방법입니다.
- cd /etc/ssl
- sudo openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/site.example.com.key -out certs/site.example.com.crt
보통 외부에 공개하기 위해서는 별도의 기관에서 제공하는 인증서를 발급받아야 하고, 대체로 유료이지만, Let's Encrypt는 비영리기관으로서 무료로 인증서를 발급해 줍니다.
External resources
- http://nginx.org/en/docs/beginners_guide.html - A nginx beginner's guide. Helpful for those who do not know much about nginx.
- http://nginx.com/resources/admin-guide/ - The ngnix Admin guide. Helpful for web administrators who have been working in the field.
- http://wiki.nginx.org/Main - nginx Wiki.
- https://github.com/h5bp/server-configs-nginx - H5BP nginx config.
- https://www.techrepublic.com/article/3-quick-steps-to-optimize-the-performance-of-your-nginx-server/
- https://github.com/denji/nginx-tuning
- ondrej Ubuntu ppa
- ondrej Ubuntu mainline ppa
- Ubuntu ppa more modules