우분투(Ubuntu) 18.04 - LEMP(+PHP+MariaDB) 2 - Nginx 설정/Server Blocks/Redirect 설정

Last Updated on 12월 21, 2020 by 태랑(정현호)



[먼저] 해당 글은 AWS EC2에 우분투 서버 18.04를 이용하여 LEMP 스택구성(nginx 1.19.3 mainline + php 7.4 + mariadb 10.05) 및 도메인 설정, SSL 설정, WordPress 웹 블로그 구축 까지 이어지는 글 입니다

[연관된 이전 포스팅 글]
아마존 AWS 클라우드 프리티어 - 1 계정 가입/생성 - MFA OTP 설정
아마존 AWS 클라우드 프리티어 - 2 EC2(VM/VPS) 생성
아마존 AWS 클라우드 프리티어 - 3 탄력적 IP(고정IP) 인 Elastic IP 생성 및 할당

우분투(Ubuntu) 18.04 서버 초기 설정
우분투(Ubuntu) 시간 동기화 설정- Chrony
우분투(Ubuntu) 18.04 - LEMP(Nginx+PHP+MariaDB) 1 - 설치 및 초기 설정
웹 기반 mysql 관리툴 - phpmyadmin 설치 및 설정
freenom 에서 최상위 국가 무료 도메인 발급 받기







nginx conf 설정 변경



nginx 의 설정을 몇가지 변경 및 추가 하도록 하겠습니다.

ubuntu$ cd /etc/nginx
ubuntu$ sudo vi nginx.conf





use epoll;

nginx 에서 file description 방식에 대한 설정으로 가장 효율적인 poll 방식으로 지정입니다 버전에 따라 기재 하지 않아도 default 로
epoll 로 동작 할 수도 있습니다

명시적으로 추가해 주도록 하겠으며 events 블럭에 추가 하면 돕니다.

events {
use epoll;   <== 추가
worker_connections 1024;
}

epoll 적용되었다면 nginx 기동시 error 로그에 "using the "epoll" event method" 확인 할 수 있습니다.

* error_log 가 기본값인 warn 레벨이면 보이지 않습니다.
확인하고자 할때는 debug 레벨로 사용해야 합니다.




server_tokens off;

nginx의 version 정보를 reponse 에서 명시하지 않도록 하는 옵션 입니다
설정 변경 전후 curl 를 통해 확인 할 수 있습니다.

On 설정 시(default)
ubuntu$ sudo curl -i h2code.cf
HTTP/1.1 200 OK
Server: nginx/1.19…..

off 시
ubuntu$ sudo curl -i h2code.cf
HTTP/1.1 200 OK
Server: nginx
<중략>






client_max_body_size 20M;

업로드 용량 관련 된 내용으로 설정값을 초과하게 되면 HTTP 413(Request Entity Too Large) 에러가 발생 하게 됩니다.
default는 1MB 이며 위에서 20M 은 예시 입니다.

1MB 이상 업로드가 필요하다면 이 값을 늘려주시면 될 것 같습니다
0 으로 설정시 body size 에 대한 cheking이 disable 되게 됩니다(기능 비활성화)







NOFILE 값이 변경

nginx 가동시 error 로그에 아래와 같이 NOFILE의 가능한 수를 확인 할 수 있습니다.
getrlimit(RLIMIT_NOFILE): 1024:4096
soft limit 1024 ~  hard limit 4096 을 의미 합니다.

nginx 로 많은 접속자나 사용량이 있는 환경인  경우 해당 값을 늘려줄 필요가 있습니다.




서비스 시작시 사용되는 스크립트를 확인 합니다.
ubuntu$ sudo systemctl status nginx
● nginx.service - nginx - high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)

스크립트에 내용을 추가 합니다.
ubuntu$ sudo vi /lib/systemd/system/nginx.service

[Service]
LimitNOFILE=65536
-> [Service] 항목에 내용을 추가 합니다.


nginx 재시작을 합니다.
ubuntu$ sudo systemctl daemon-reload
ubuntu$ sudo systemctl restart nginx


로그를 확인 합니다.
ubuntu$ sudo tail -100f /var/log/nginx/error.log

21320: built by gcc 
21320: OS: Linux - aws
21320: getrlimit(RLIMIT_NOFILE): 65536:65536 <==

RLIMIT_NOFILE 값이 변경 된 것을 확인 할 수 있습니다.


* error_log 가 기본값인 warn 레벨이면 보이지 않습니다.
확인하고자 할때는 debug 레벨로 사용해야 합니다.







nginx - Server Block 이란



Apache 에서 Virtualhost 라는 명칭으로 1개의 http 웹서버가 서브 도메인별 접속시 다른 웹페이지를 보여주거나 1개이상의 여러개의 도메인의 접속시 접속을 한 도메인 별로 설정된 웹페이지를 보여주는 기능 입니다



[참고] Server Block(Apache의 virtualhost) 를 테스트 해보거나 실제로 사용 해보기 위해서는 도메인이 있으면 좋습니다.

도메인은 freenom 에서  무료로 발급 받아서 사용 해볼 수 있습니다.



추가적인 예로 1개의 웹서버에서 언어별로 다른 페이지가 구현되어 있을 경우 서브 도메인을 설정하여 사용 할 수 있습니다.

ko.domain.com 에서는 한국어로 en.domain.com 은 영어로 작성된 페이지를 보여주거나 하는 등으로 서브 도메인을 활용할 수 있습니다.


웹 서버 1개에서 다수의 도메인 mydomain1.com / mydomain2.com 의 접속을 처리 해주고자 할때, 혹은 mydomain1.com 접속시 redirect 하여 -> mydomain2.com  로 접속을 전달 한다던지 하는 등 여러가지 형태로 사용 할 수 있는 기능 입니다.


Apache 가 오래전 부터 사용해서 이러한 기능을 통상적으로 virtualhost(가상호스트) 로 불리며 nginx 에서는 server block 이라고 합니다.


포스팅에 사용된 1.19 대 버전 또는 이전의 버전부터 /snippets /sites-enabled , /sites-available 같은 디렉토리 없이 conf.d 디렉토리만 존재 하고 nginx.conf 파일에서는 모든 conf 파일을 include 하여 사용하게 됩니다.

nginx 설치 후 /etc/nginx/conf.d 디렉토리를 보시면 default.conf 파일이 있습니다.
이 파일을 통해서 가상호스트의 기능을 설정해서 사용 할 수 있습니다.


도메인이나 서비스가 여러개 일 경우 관리적인 목적으로 conf 파일을 분리해서 사용 할 수 있습니다.
ex )  mydomain1.conf     /   mydomain2.conf   혹은 customer.mydomain1.conf


기본 제공되는 default.conf 파일에서 수정/추가 하여 해당 파일 1개만 사용 하여 여러개 도메인이나 서브 도메인 내용을 추가 하여 사용 하여도 됩니다.







Server block 설정



아래와 같이 2개의 디렉토리에 대해서 서브 도메인 별로 설정하여 접속을 하는 Server Block을 설정 하도록 하겠습니다.



# OpCache Web Monitor App
address => opcache.h2code.cf
/usr/share/nginx/html/OpCacheGUI


# 웹 기반 Mysql 관리툴
address => myadmin.h2code.cf
/usr/share/nginx/html/phpmyadmin



[참고]
OpCacheGUI 는 PHP OpCache 설정 내역과 사용현황을 웹에서 확인 해볼 수 있는 툴 입니다.


phpmyadmin은 PHP 로 작성된 웹 기반 Mysql(MariaDB) 관리툴 입니다




nginx 설정 디렉토리로 이동 후 default.conf 파일에서 내용을 추가 하도록 하겠습니다


ubuntu$ cd /etc/nginx/conf.d
==> 해당 디렉토리에 Server Block 을 포함한 여러 설정 내역들을 파일로 생성하게 되면 nginx 가 기동 되면서 적용되게 됩니다

ubuntu$ vi default.conf
-> 파일을 여러개로 분리해도 되고 , 해당 파일을 써도 되며  파일명을 변경해도 됩니다.


위의 내용은 아래와 같이 설정 내역이 되게 됩니다.





# myadmin.h2code.cf 도메인 설정 부분
server {
server_name myadmin.h2code.cf;     #<-- 도메인명을 입력 합니다.

charset utf-8;   <-- 웹 페이지에서 사용될 케릭터셋 입니다 Server Block 별 지정 할 수 있습니다
root /usr/share/nginx/html/phpmyadmin;   #<-- 웹페이지가 있는 디렉토리를 입력합니다
index index.php index.html index.htm;   #<-- 접속시 처음 읽게 되는 파일을 지정


# 아래 access_log 와 error_log 는 아래와 같이 서비스명이나 도메인 명의 식별이 가능한

# 이름을 지정하여 Server Block 단위로 설정 하는 것이 로그파일 모니터링에 좋습니다.
access_log /var/log/nginx/myadmin.h2code.cf.access.log main;
error_log /var/log/nginx/myadmin.h2code.cf.error.log;


location / {

try_files $uri $uri/ =404;
}

error_page 500 502 503 504 /50x.html;

location = /50x.html {
root /usr/share/nginx/html;
}


# 아래는 PHP-FPM 과 연동 하는 부분 입니다.
location ~ .php$ {
   # fastcgi_pass ip 혹은 UDS(Unix Domain Socket)인 .sock 파일중에
   # php-fpm.d/www.conf 에서 설정대로 사용 해야 합니다
   #fastcgi_pass 127.0.0.1:9000;

fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 300;
}



 # .htaccess 파일에는 여러가지 rewriteRule 이나 설정이 담겨져 있기 때문에 접근을 막는 설정 입니다
location ~ /.ht {   
deny all;
}
}



# opcache.h2code.cf 도메인 설정 부분, 설정 내역은 위와 동일 합니다.
server {
server_name opcache.h2code.cf;
root /usr/share/nginx/html/OpCacheGUI;
index index.php index.html index.htm;
access_log /var/log/nginx/opcache.h2code.cf.access.log main;
error_log /var/log/nginx/opcache.h2code.cf.error.log debug;
try_files $uri $uri/ /index.php;
charset utf-8;

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

location ~ .php$ {
  # fastcgi_pass ip 혹은 UDS(Unix Domain Socket)인 .sock 파일중에
  # php-fpm.d/www.conf 에서 설정대로 사용 해야 합니다
  #fastcgi_pass 127.0.0.1:9000;

fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 300;
}

location ~ /.ht {
deny all;
}
}




이렇게 여기 까지 설정 후 nginx 를 재시작 후 접속 하여 테스트를 해봅니다.















Redirect 



redirect 란 무조건 혹은 특정 조건에 맞는 경우 일때 지정된 다른 주소나 페이지로 이동을 의미 합니다.


www.domain.com / domain.com 는 같은 페이지가 서비스 되는 경우가 보통 입니다

같은 페이지를 보여주는데 있어서 주소를 각각 달리하여 서비스를 해줄 수도 있고 접속시 non-www -> www 로 주소가 바뀌면서 접속 되는 경우도 있을수 있습니다.

반대로 www -> non->www 으로 변환 되고 접속이 될수도 있습니다.


구글이나 네이버, 다음과 같이 검색엔진 서비스 에서 검색을 하였을 때 검색이 잘 되도록 하는 작업 혹은 방법이 있으며 그것을
"검색엔진최적화(Search Engine Optimization, SEO)" 라고 부릅니다.


이런 SEO 에서 기본적인 가이드는 접속 주소의 단일화 입니다.




예를 들어 http 가 있고 https 둘다 접속이 가능한 환경에
non-www 도 별도의 주소로 접속되어 서비스가 되고
www 도 별도의 주소로 접속되어 서비스가 되었을 때


검색엔진 사이트에서 관리 되는 사이트의 접속 수나 랭킹이나 검색 결과가 각각 4개로 관리 되게 됩니다.

http://domain.com   /    http://www.domain.com
https://domain.com   /   https://www.doamin.com


구글 서치콘솔 등에서도 별도로 접속에 대한 로깅이 이루어지게 됩니다.

그렇기 때문에 SEO 관리상 주소의 단일화가 필요하고 이럴 때 사용 할 수 있는 기능이 redirect 입니다.


혹은 예전 도메인 주소로 접속한 접속자를 새로운 도메인 주소로 이동시키거나 특정 페이지나 주소 등에 접속 했을때 방지하고자 redirect 로 메인페이지로 이동 시킨다는 등의 여러 용도로 사용 할 수 있습니다






방법은 정규식과 if 등의 조합으로 여러개가 있을수 있습니다.

4개 정도를 설명 드리면


먼저 첫번째로는
server block 모두 작성 하고 Server 별로 매칭하여 return 을 이용하여 redirect 하는 방법으로 보통적으로 많이 사용 되는 패턴입니다.

server {
listen 80;
server_name www.domain1.com;
return 301 $scheme://example.com$request_uri;
}
server {
listen 80;
server_name domain1.com;
root /usr/share/nginx/html/domain1.com;
}
==> www.domain1.com 으로 접속 하면 return 으로 non-www 인 domain1.com 으로 접속되게 됩니다.

server {
listen 80;
server_name www.domain1.org;
return 301 $scheme://domain1.org$request_uri;
}

server {
listen 80;
server_name domain1.org;
root /usr/share/nginx/html/domain1.org;
}
==> www.domain1.org 으로 접속 하면 return 으로 non-www 인 domain1.org 으로 접속되게 됩니다.





두번째는 
모든 server 에 대해서 non-www to www 나 www to non-www 로 redirect 하는 구문으로 정규식을 사용하여 처리하게 만드는 겁니다.

non-www to www
server {
server_name ~^(?!www.)(?<domain>.+)$;
return 301 $scheme://www.$domain$request_uri;
}

www to non-www
server {
server_name ~^www.(?<domain>.+)$;
return 301 $scheme://$domain$request_uri;
}





3번째로는 
2번째의 server_name 에서의 정규식 사용처럼 if 에서 정규식을 사용하는 방법 입니다.

non-www to www
server {
listen 80;
server_name mydomain.com;
if ($host ~ ^(?!www.)(?<domain>.+)$) {
return 301 $scheme://www.$domain$request_uri;
}


www to non-www
server {
listen 80;
server_name www.mydomain.com;
if ($host ~ ^www.(?<domain>.+)$) {
return 301 $scheme://$domain$request_uri;
}





네번째로
위의 내용들 다시 응용 하면 아래와 같이 server block 1개로도 처리가 가능하게 작성할 수 있습니다.

server {
listen 80 default_server;

server_name h2code.cf www.h2code.cf;

if ($host ~ ^www.(?<domain>.+)$) {
return 301 $scheme://$domain$request_uri;
}


nginx 의 server_name 는 apache의 ServerAlias 기능처럼 동작하게 됩니다.

server_name 절에 여러 서브 도메인 혹은 다른 도메인을 사용 할 수 있습니다.


= apache
ServerAlias sub1.domain.com sub2.domain.com sub3.domain.com

= nginx
server_name sub1.domain.com sub2.domain.com sub3.domain.com;


위의 예제에서 1개의 server block 에서 non-www 와 www 를 모두 추가하여 둘다 사용할수 있게 되고 그 중에 www 로 접속 하게 되면 non-www 로 redirect 를 하게 되는 구문 입니다.


이와 같이 정규식과 if 등을 이용한 게 되면 이외에도 더 많은 방법을 통해 원하는 목적대로 redirect 를 작성 하실 수 있고 뒤에서 SSL 적용할때도 return(redirect) 를 통한 HTTPS 로만 접속 하도록 설정 할 수 있습니다.


다음은 Certbot 을 통한 무료 인증서 발급 및 HTTPS 적용과 HTTP2 적용 을 진행하도록 하겠습니다.


이어지는 다음글 : Certbot 을 통한 무료 SSL 인증서 적용 및 HTTP/2 적용



관련된 글

“우분투(Ubuntu) 18.04 - LEMP(+PHP+MariaDB) 2 - Nginx 설정/Server Blocks/Redirect 설정” 에 대한 2 댓글

  1. 핑백: Nginx 에 Certbot을 통한 무료 SSL인증서 적용 및 HTTP/2 적용 | | Hoing

  2. 핑백: WordPress(워드프레스) 설치 하기 - 개인 블로그 및 사이트 구축 | | Hoing

답글 남기기