HC님을 위한 WordPress & NextCloud 설치 절차 Part 2
freenom.com 무료 도메인은, 루트 도메인에 CNAME 주소(iptime ddns)를 매핑할 수 없는것같다. A Record 만 루트 도메인으로 지정할 수 있는 듯 기존에 하려고 했던
- example.com
- 대문
- example.com/blog
- 블로그
- example.com/drive
- 클라우드 스토리지
위와 같은 구성 대신 다음과 같이 서브 도메인 주소를 이용해서 웹서비스를 분리할 예정.
- example.com / www.example.com
- 대문
- blog.example.com
- 블로그
- drive.example.com
- 클라우드 스토리지
Nextcloud 는 보안 연결이 권장사항이기 때문에 이왕 하는김에 인증서도 발급 받아 ssl 설정까지 진행한다.
Let’s Encrypt 무료 SSL 인증서 발급
https://oboki.net/workspace/system/security/lets-encrypt/ 가이드 대로 아래 도메인에 대한 인증서를 발급받는다.
- www.example.com
- blog.example.com
- drive.example.com
Apache httpd 설정 변경
httpd.conf
vi /sw/httpd/conf/httpd.conf
파일을 열어 기존에 다음과 같이 설정돼 있던 부분을
DocumentRoot "/data2/docs"
<Directory "/data2/docs">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride All
#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>
아래와 같이 변경해주고
DocumentRoot "/data2/docs"
<Directory "/data2/docs/www">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<Directory "/data2/docs/blog">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<Directory "/data2/docs/drive">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
다음과 같은 디렉토리를 생성해준다.
- /data2/docs/www
- www.example.com 서브 도메인의 루트 경로
- /data2/docs/blog
- blog.example.com 서브 도메인의 루트 경로
- /data2/docs/drive
- drive.example.com 서브 도메인의 루트 경로
vi /sw/httpd/conf/httpd.conf
파일에서 추가로 다음 설정들을 주석해제한다.
LoadModule ssl_module modules/mod_ssl.so
# Secure (SSL/TLS) connections
Include conf/extra/httpd-ssl.conf
httpd-ssl.conf
이어서 vi /sw/httpd/conf/extra/httpd-ssl.conf
파일에서 가상 호스트와 인증서 정보에 대한 설정을 추가한다.
Listen 443
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
SSLHonorCipherOrder on
SSLProtocol all -SSLv3
SSLProxyProtocol all -SSLv3
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/sw/httpd/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300
<VirtualHost _default_:443>
DocumentRoot "/data2/docs/www"
ServerName www.example.com
ServerAdmin skia@example.com
ErrorLog "/sw/httpd/logs/error_log"
TransferLog "/sw/httpd/logs/access_log"
SSLEngine on
SSLCertificateFile "/etc/letsencrypt/live/www.example.com/cert.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/www.example.com/privkey.pem"
SSLCertificateChainFile "/etc/letsencrypt/live/www.example.com/fullchain.pem"
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/sw/httpd/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "/sw/httpd/logs/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
<VirtualHost _default_:443>
DocumentRoot "/data2/docs/blog"
ServerName blog.example.com
ServerAdmin skia@example.com
ErrorLog "/sw/httpd/logs/error_log"
TransferLog "/sw/httpd/logs/access_log"
SSLEngine on
SSLCertificateFile "/etc/letsencrypt/live/www.example.com/cert.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/www.example.com/privkey.pem"
SSLCertificateChainFile "/etc/letsencrypt/live/www.example.com/fullchain.pem"
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/sw/httpd/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "/sw/httpd/logs/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
<VirtualHost _default_:443>
DocumentRoot "/data2/docs/drive"
ServerName drive.example.com
ServerAdmin skia@example.com
ErrorLog "/sw/httpd/logs/error_log"
TransferLog "/sw/httpd/logs/access_log"
SSLEngine on
SSLCertificateFile "/etc/letsencrypt/live/www.example.com/cert.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/www.example.com/privkey.pem"
SSLCertificateChainFile "/etc/letsencrypt/live/www.example.com/fullchain.pem"
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/sw/httpd/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "/sw/httpd/logs/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
이렇게 가상호스트를 설정해주게 되면 물리적으로는 같은 서버에 접근하더라도 클라이언트가 어떤 호스트의 요청을 했는지(blog.example.com 으로 접근했는지 drive.example.com 으로 접근했는지)에 따라 웹서버가 다른 서비스를 제공한다.
여기까지 설정이 완료되었으면 root 계정에서 httpd -k restart
명령으로 아파치를 재기동하고, 기존의 웹 소스들을 해당 서브도메인들의 루트 경로들로 이동시켜 사용하면 끝.
RewriteRule
보안 연결만을 이용해서 서비스하기위해 vi /sw/httpd/conf/httpd.conf
파일에서 다음과 같은 설정을 추가하여, http 접속을 https 로 모두 리다이렉션할 수 있다.
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
선택적으로 http 접근을 사용하기 위해서는 httpd-vhosts.conf
를 로드해서 별도 설정을 해주어야 한다.