Contents
개인 서버에 Ubuntu LEMP WORDPRESS 설치하기 12
개인 서버에 Ubuntu sever LEMP(Linux-ubuntu+Nginx+MariaDB-Phpmyadmin+PHP8.3) WORDPRESS 설치하기
개인 서버에 SSL 인증서를 무료로 발급받는 가장 대표적인 방법은 Let’s Encrypt를 사용하는 것입니다. Let’s Encrypt는 무료, 자동화된, 개방된 인증 기관(CA)으로, HTTPS를 통해 웹사이트의 보안을 강화하기 위해 무료 SSL/TLS 인증서를 제공합니다. 여기서는 Let’s Encrypt를 이용해 SSL 인증서를 발급받고 설치하는 기본적인 과정을 소개하겠습니다.
12-1. HTTPS 적용을 위한 SSL 인증서 발급 받기
먼저 Let’s Encrypt SSL 인증서를 발급받기 전 환경을 구성해 보겠습니다.
Let’s Encrypt SSL 발급을 위한 /.well-known/acme-challenge 를 구성하는데 여기서는 /var/www/ 아래 letsencrypt 라는 폴더를 만들어 그 아래 만들겠습니다/
명령창에 mkdir -p /var/www/letsencrypt/.well-known/acme-challenge 를 입력합니다.
junewoo@cvilla:~$ mkdir -p /var/www/letsencrypt/.well-known/acme-challenge
12-2. Nginx에 acme-challenge 폴더 위치를 알리기 위하여 letsencrypt.conf 파일 만들기
Nginx 라우팅 설정파일은 /etc/snippets/ 폴더에서 관리하는데 그 아래 letsencrypt.conf 파일을 만들고 여기서 로그인한 계정인 junewoo가 해당 폴더 권한이 없으므로 해당 권한 및 파일수정권한을 가져오도록 하겠습니다.
a. 명령창에 sudo touch /etc/nginx/snippets/letsencrypt.conf 를 입력합니다.
b. 명령창에 sudo chown root:junewoo /etc/nginx/snippets/letsencrypt.conf 를 입력합니다.
c. 명령창에sudo chmod 775 /etc/nginx/snippets/letsencrypt.conf 를 입력합니다.
junewoo@cvilla:~$ sudo touch /etc/nginx/snippets/letsencrypt.conf
junewoo@cvilla:~$ sudo chown root:junewoo /etc/nginx/snippets/letsencrypt.conf
junewoo@cvilla:~$ sudo chmod 775 /etc/nginx/snippets/letsencrypt.conf
nano 에디터로 letsencrypt.conf 파일을 수정합니다.
Putty 명령창에 sudo nano /etc/nginx/snippets/letsencrypt.conf를 입력합니다.
junewoo@cvilla:~$ sudo nano /etc/nginx/snippets/letsencrypt.conf
화면이 나오면 아래 내용을 붙여줍니다. (드래그하여 CTRL + C 한후 PuTTY 화면에서 마우스 오른쪽 버튼 클릭)
location ^~ /.well-known/acme-challenge/ {
default_type “text/plain”;
root /var/www/letsencrypt;
}
그 다음 CTRL + X 한 후 Y를 누르고 파일명이 나오면 Enter키를 눌러줍니다.
ocation ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}
12-3. Nginx 라우팅 설정을 위해 letsencrypt.conf의 내용을 붙여줍니다.
Editplus 에서 /etc/nginx/sites-available/default 를 수정합니다.
server_name 도메인명; 아래 include /etc/nginx/snippets/letsencrypt.conf; 를 붙여줍니다.
그러면 nginx 라우팅 설정은 다음과 같이 됩니다.
# Default server configuration
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name junewoo.com;
include /etc/nginx/snippets/letsencrypt.conf; ### .well-know/acme-challenge 알림
location / {
try_files $uri $uri/ =404;
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 300;
}
location ~ /\.ht {
deny all;
}
}
### HTTP (CNAME 연결 www.junewoo.com to junewoo.com) ###
server {
listen 80;
listen [::]:80;
server_name www.junewoo.com;
include /etc/nginx/snippets/letsencrypt.conf; # .well-know/acme-challenge 알림
location / {
return 301 http://junewoo.com$request_uri; ### http://junewoo.com 로 리다이렉팅
}
}
위 내용을 적용해 주기 위하여 nginx를 재가동 합니다.
명령창에 sudo nginx -t 와 sudo service nginx restart 를 입력합니다.
junewoo@cvilla:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
junewoo@cvilla:~$ sudo service nginx restart
이제 Let’s Encrypt SSL 발급을 위한 환경이 모두 갖추어졌습니다.
12-4. Let’s Encrypt SSL를 발급 받아 보겠습니다.
certbot-auto 로는 설치 시 에러가 발생합니다. snap 명령어로 classic certbot를 설치합니다.
a. Putty 명령창에 sudo snap install core; sudo snap refresh core 를 입력합니다.
b. 명령창에 sudo snap install –classic certbot 를 입력합니다.
c. 명령창에 sudo ln -s /snap/bin/certbot /usr/bin/certbot 를 입력합니다.
junewoo@cvilla:~$
sudo snap install core; sudo snap refresh core junewoo@cvilla:~$ sudo snap install --classic certbot junewoo@cvilla:~$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
12-5. Certbot을 이용하여 HTTPS SSL 인증서를 발급받습니다.
명령창에 sudo certbot certonly –webroot –agree-tos –no-eff-email –email 이메일주소 -w /var/www/letsencrypt -d 도메인명 -d 도메인명(www포함) 를 입력합니다.
junewoo@cvilla:~$ sudo certbot certonly --webroot --agree-tos --no-eff-email --email cvilla@hanmail.net -w /var/www/letsencrypt -d junewoo.com -d www.junewoo.com
이어서 설치하겠냐는 질문이 나오면 Y를 누릅니다.
After this operation, 194 MB of additional disk space will be used.
Do you want to continue? [Y/n] y 를 입력합니다.
Requesting to rerun /home/ubuntu/certbot-auto with root privileges...
Bootstrapping dependencies for Debian-based OSes... (you can skip this with --no-bootstrap)
Hit:1 http://ap-seoul-1-ad-1.clouds.archive.ubuntu.com/ubuntu bionic InRelease
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Hit:3 http://ppa.launchpad.net/ondrej/php/ubuntu bionic InRelease
Get:4 http://ap-seoul-1-ad-1.clouds.archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:5 http://ap-seoul-1-ad-1.clouds.archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Fetched 252 kB in 2s (125 kB/s)
Reading package lists... Done
Reading package lists... Done
............................................................
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/itreport.tk/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/itreport.tk/privkey.pem
Your cert will expire on 2024-05-21. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
설치가 되면 마지막부분에 IMPORTANT NOTES: 에 Congratulations!이라고 시작하면서 HTTPS 인증서 파일 및 개인암호키가 저장되었다고 나옵니다. 또, expire on 2024-05-21 이라고 표시된 인증서 만료일도 나타납니다.
12-6. 잘 설치 저장이 되었는지 확인해 보겠습니다.
명령창에 sudo ls -al /etc/letsencrypt/live/도메인명 을 입력합니다.
아래처럼 나오면 정상적으로 SSL키가 발급되어 저장된 것입니다.
junewoo@cvilla:~$ sudo ls -al /etc/letsencrypt/live/junewoo.com
total 12
drwxr-xr-x 2 root root 4096 Feb 21 20:57 .
drwx------ 4 root root 4096 Dec 23 18:43 ..
lrwxrwxrwx 1 root root 35 Feb 21 20:57 cert.pem -> ../../archive/junewoo.com/cert2.pem
lrwxrwxrwx 1 root root 36 Feb 21 20:57 chain.pem -> ../../archive/junewoo.com/chain2.pem
lrwxrwxrwx 1 root root 40 Feb 21 20:57 fullchain.pem -> ../../archive/junewoo.com/fullchain2.pem
lrwxrwxrwx 1 root root 38 Feb 21 20:57 privkey.pem -> ../../archive/junewoo.com/privkey2.pem
-rw-r--r-- 1 root root 692 Dec 23 09:27 README
junewoo@cvilla:~$
12-7. 인증서 만료 시일을 확인해 보게습니다.
명령창에 sudo certbot certificates -d 도메인명을 입력합니다.
junewoo@cvilla:~$ sudo certbot certificates -d junewoo.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following matching certs:
Certificate Name: junewoo.com-0001
Serial Number: 48543f944489b38b1c1db9898849009ae56
Key Type: ECDSA
Domains: junewoo.com
Expiry Date: 2024-05-21 10:56:50+00:00 (VALID: 69 days)
Certificate Path: /etc/letsencrypt/live/junewoo.com-0001/fullchain.pem
Private Key Path: /etc/letsencrypt/live/junewoo.com-0001/privkey.pem
Certificate Name: junewoo.com
Serial Number: 41c8011902b7b99fc364919f4c551da18ed
Key Type: ECDSA
Domains: junewoo.com www.junewoo.com
Expiry Date: 2024-05-21 10:57:01+00:00 (VALID: 69 days)
Certificate Path: /etc/letsencrypt/live/junewoo.com/fullchain.pem
Private Key Path: /etc/letsencrypt/live/junewoo.com/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
junewoo@cvilla:~$
만료일 시 가 Expiry Date: 2024-05-21 10:57:01+00:00 (VALID: 69 days)로 나타납니다.
인증서 갱신은 나중에 워드프레스에 정말 간단한 SSL 플러그인을 설치하시면 자동으로 갱신이 됩니다.
이번에는 SSL 인증서를 웹서버인 Nginx에 적용해 보겠습니다.
12-8. 인증서를 적용하기 위해 openssl을 사용하여 dhparam을 암호화 합니다.
명령창에 sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096 를 입력합니다.
진행 시간이 20~30분 정도 걸립니다.
junewoo@cvilla:~$ sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096
Generating DH parameters, 4096 bit long safe prime, generator 2
This is going to take a long time
..............................+...................................................
............................+.....................................................
..................................................................................
....+..+............................+.............................................
..................................................................................
..................................................................................
.........................+........................................................
...........................................................+......................
.............................................+....................................
..................................................................................
..................................................................+...............
..................................................................................
.........................................+......................................+.
..................................................................................
..................................................................................
..............................................................................+...
.....+............................................................................
..................................................................................
.............................+............................+.......................
..................................................................................
........+.........................................................................
..........................................................+.......................
................................................................+...+.............
................+.....................+...........................................
........................................................++*++*++*
드디어 dhparam.pem이 생성되었다면 이제 ssl.conf를 생성해 보겠습니다.
명령창에 sudo touch /etc/nginx/snippets/ssl.conf 와 sudo chmod 777 /etc/nginx/snippets/ssl.conf 를 입력합니다.
junewoo@cvilla:~$ sudo touch /etc/nginx/snippets/ssl.conf
junewoo@cvilla:~$ sudo chmod 777 /etc/nginx/snippets/ssl.conf
12-9. 생성된 ssl.conf에 보안설정문을 입력합니다.
ssl.conf 보안설정문 입력을 위하여 Editplus로 접속하여 /etc/nginx/snippets/에 접속 ssl.conf 파일을 열어 아래 내용을 입력합니다.
또는 Putty 명령창에 sudo nano /etc/nginx/snippets/ssl.conf 를 입력합니다.
junewoo@cvilla:~$ sudo nano /etc/nginx/snippets/ssl.conf
아래 내용을 드래그 하신 후 CTRL + C 하시고 PuTTY화면에서 마우스 오른쪽을 눌러 붙이신 후 CTRL + X하시고 Yes을 누르신 다음 파일명이 나오면 Enter키를 누르시면 됩니다.
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4;
add_header Strict-Transport-Security “max-age=15768000; includeSubdomains; preload”;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options “SAMEORIGIN”;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4;
add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
12-10. ssl.conf가 작성이 완료되면 수정할 수 없도록 권한을 변경합니다.
명령창에 sudo chmod 644 /etc/nginx/snippets/ssl.conf 를 입력합니다.
junewoo@cvilla:~$ sudo chmod 644 /etc/nginx/snippets/ssl.conf
12-11. 이제 nginx에 라우팅을 적용해 보겠습니다.
전체적으로 HTTPS가 적용된 도메인으로 운영하기 위하여 /etc/nginx/sites-available/default 파일을 수정합니다.
내용이 복잡하기에 에디터로 수정하시는 것을 추천합니다.
아래 내용을 자신의 도메인 이름으로 변경하여 전체 내용을 복사(Ctrl+C) 붙여넣기(Ctrl+V)를 합니다.
제가 작성한 도메인은 junewoo.com 입니다. 해당 내용을 본인이 등록한 도메인 이름으로 변경해 주시면 됩니다.
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
# SSL configuration
#
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate /etc/letsencrypt/live/junewoo.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/junewoo.com/privkey.pem;
#
# Note: You should disable gzip for SSL traffic.
# See: https://bugs.debian.org/773332
#
# Read up on ssl_ciphers to ensure a secure configuration.
# See: https://bugs.debian.org/765782
#
# Self signed certs generated by the ssl-cert package
# Don't use them in a production server!
#
# include snippets/snakeoil.conf;
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
server_name junewoo.com;
include /etc/nginx/snippets/letsencrypt.conf; ### .well-know/acme-challenge 알림
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
}
# pass PHP scripts to FastCGI server
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 300;
}
location ~ /\.ht {
deny all;
}
}
### HTTP (CNAME 연결 www.junewoo.com to junewoo.com ) ###
server {
listen 80;
listen [::]:80;
server_name www.junewoo.com;
location / {
return 301 http://junewoo.com$request_uri; ### http://junewoo.com 로 리다이렉팅
}
}
# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}
다음은 에디터 갭쳐 화면입니다.
12-12. Nginx를 다시 재가동하고 사이트에서 확인해 봅니다.
명령창에 sudo nginx -t 를 입력합니다.
명령창에 sudo service nginx restart 를 입력합니다.
junewoo@cvilla:~$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
junewoo@cvilla:~$ sudo service nginx restart
junewoo@cvilla:~$
웹브라우저에서 확인해보면 HTTPS가 적용된 것을 확인할 수 있습니다.
이상으로 길고도 힘든 SSL 설치 과정이었습니다.
마지막에서 홈 페이지에 적용이 잘 안되시면 나중에 워드프레스설치 후 “정말 간단한 SSL” 플러그인을 설치하시기를 추천합니다.
다음글은 MariaDB와 phpMyAdmin 의 설정입니다.