버전 0.1 (db, web 구축 2022.03.15)
버전 1.0 (dns, https 구축, word press 활성 2022.03.16)
버전 1.1 (nfs, 로드밸런싱 구축 2022.03.17)
문서 마무리 2022.03.18
목록 | 내용 |
---|---|
작업 기간 | 2022.03.15 ~ 2022.03.18 |
인원 | 1명 |
참고자료 |
DNS서버, WEB서버, DB서버 3가지의 리눅스 서버 인프라를 구축을 통한 WORDPRESS 구현, NFS 서버를 통한 파일 및 디렉토리 공유 활성화, 로드 밸런싱을 통한 트래픽 분산 환경 구축
시스템명 | 버전 |
---|---|
Linux | CentOS Linux-7.5.1804(Core) |
DNS Server | bind-9.11.4 |
WEB Server | Apache(httpd-2.4.6-97) + php-7.4 + wordpress |
DATABASE Server | mysql-15.1, MariaDB-10.7.3 |
Client | Window Chorme |
https | mod_ssl-2.4.6-97 |
nfs | nfs-utils-1.3.0 |
wordpress를 사용하기 위해선 Mysql 5.7 또는 MariaDB 10.2 이상 필요
How to install MariaDB on CentOS 7 / RHEL 7
mariadb_repo_setup파일을 구성하기 위해 wget 설치 후 진행
[root@db ~]# yum install wget
[root@db ~]# wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
[root@db ~]# chmod +x mariadb_repo_setup
[root@db ~]# ./mariadb_repo_setup
[root@db ~]# yum install MariaDB-server
mariadb 서비스 활성화 및 리눅스 시스템 재가동 시에도 자동으로 실행될 수 있도록 설정
[root@db ~]# systemctl start mariadb.service
[root@db ~]# systemctl enable mariadb.service
mariadb 10.4 이상부터 mysql_secure_installaion은 mariadb-secure-installaion으로 대체
[root@db ~]# mariadb-secure-installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
mariadb 10.4 이상부터 보안 설정을 실행하면 루트 계정이 이미 보호되어 있으므로 unix_socket 인증 설정이나 암호 설정여부에 n으로 설정해도 안전
Switch to unix_socket authentication [Y/n] n
... skipping.
wordpress 설정 시에 필요하기 때문에 루트 비밀번호 설정
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
n 설정 시 사용자 계정을 만들지 않아도 접근 가능하므로 Y로 설정
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] y
... Success!
Y로 설정 시, 외부에서 데이터베이스 접근 불가
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] n
... skipping.
test DB는 사용하지 않을 것이므로 Y
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Y 선택 시 변경사항 즉시 적용
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] y
... Success!
db 보안 설정 완료
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
wordepress에서 생성된 데이터를 조회, 생성, 삭제, 업데이트를 위한 데이터베이스 생성
[root@db ~]# mysql -u root -p
MariaDB [(none)]> CREATE DATABASE wordpress;
Query OK, 1 row affected (0.001 sec)
사용자@'%' -> 모든 IP에 대해 접근을 허용
MariaDB [(none)]> CREATE USER adminuser@'%' IDENTIFIED BY '패스워드';
Query OK, 0 rows affected (0.006 sec)
해당 사용자에게 wordepress 데이터베이스에 모든 테이블에 접근이 가능한 권한 부여
MariaDB [(none)]> GRANT ALL PRIVILEGES ON wordpress.* TO adminuser@'%' IDENTIFIED BY '패스워드';
Query OK, 0 rows affected (0.001 sec)
mysql은 3306 포트 사용
[root@db ~]# firewall-cmd --permanent --zone=public --add-port=3306/tcp
success
[root@db ~]# firewall-cmd --reload
success
Apache 서비스를 위한 패키지 설치
[root@server ~]# yum install httpd
[root@server ~]# systemctl start httpd
[root@server ~]# ystemctl enable httpd
[root@server ~]# firewall-cmd --add-service=http --permanent
[root@server ~]# firewall-cmd --reload
wordpress를 사용하기 위해서는 php 7.4 이상 필요
remi와 yum-utils를 사용하지 않으면 5.4 버전이 설치되므로 remi와 yum-utils로 버전 변경
[root@server ~]# yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
[root@server ~]# yum install -y yum-utils
[root@server ~]# yum-config-manager --disable remi-php54
[root@server ~]# yum-config-manager --enable remi-php74
php 7.4와 필요한 라이브러리 함께 설치
[root@server ~]# yum install php74
[root@server ~]# yum install -y php74-php php-cli php74-scldevel \
php74-php-xml php74-php-xmlrpc php74-php-soap \
php74-php-process php74-php-pgsql php74-php-pdo \
php74-php-opcache php74-php-mbstring php74-php-ldap \
php74-php-json php74-php-ioncube-loader php74-php-intl \
php74-php-gmp php74-php-gd php74-php-fpm php74-php-devel \
php74-php-dba php74-php-common php74-php-cli \
php74-php-bcmath php74-php-phpiredis php74-php-pecl-igbinary \
php74-php-pecl-imagick-im7 php74-php-pecl-imagick-im7-devel \
php74-php-pecl-igbinary-devel php74-php-pecl-geoip \
php74-php-pecl-xdebug php74-php-pecl-mysqlnd-azure
인터넷에서 파일을 받기 때문에 wget 사용
[root@server ~]# wget https://wordpress.org/latest.tar.gz
Apache 서비스를 사용하기 때문에 /var/www/html 아래에 해제
[root@server ~]# tar -xvzf latest.tar.gz -C /var/www/html
[root@server ~]# mkdir /var/www/html/wordpress/uploads
샘플 파일을 이용하여 구성
[root@server wordpress]# pwd
/var/www/html/wordpress
[root@server wordpress]# cp wp-config-sample.php wp-config.php
Apache 서비스를 사용하기 때문에 소유자 소유그룹 apache로 변경
[root@server wordpress]# chown -R apache:apache /var/www/html/wordpress
db 외부 접속 허용시 만들었던 wordpress 데이터베이스를 관리하는 adminuser 정보 입력
hostname에 도메인은 DNS 서버 구축 시 설정
[root@server wordpress]# vim wp-config.php 설정
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress' );
/** Database username */
define( 'DB_USER', 'adminuser' );
/** Database password */
define( 'DB_PASSWORD', '패스워드' );
/** Database hostname */
define( 'DB_HOST', 'db.word.project.com' );
접속 시 보여줄 web파일 경로 지정
[root@server wordpress]# vi /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html/wordpress"
...
<Directory "/var/www/html">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
...
<Directory "/var/www/html/wordpress">
[root@server wordpress]# systemctl restart httpd
[root@dns ~]# yum -y install bind bind-utils
NAT서비스를 사용하기 위해 enp0s3을 사용
192...*번대 ip주소는 연결 시 불안정하여 10번대 주소 사용
[root@dns ~]# nmcli con add con-name static ifname enp0s3
type ethernet ip4 10.0.2.10/24 gw4 10.0.2.2
[root@dns ~]# nmcli con mod static ipv4.dns 10.0.2.10
[root@dns ~]# nmcli con up static
모든 ip에 대해 질의, 응답을 허용
[root@dns ~]# vi /etc/named.conf
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { none; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing"; secroots-file "/var/named/data/named.secroots";
allow-query { any; };
....
zone "word.project.com" IN {
type master;
file "word.project.com.zone";
};
탬플릿을 위해 empty파일 이용
보안을 위해 소유그룹 named, 루트에만 권한 부여
[root@dns ~]# cd /var/named/
[root@dns named]# ls
data named.ca named.localhost slaves
dynamic named.empty named.loopback
[root@dns named]# cp named.empty word.project.com
[root@dns named]# vi word.project.com.zone
$TTL 3H
@ IN SOA word.project.zone. root.word.project.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS dns.word.project.com.
A 10.0.2.2
dns A 192.168.56.109
server A 192.168.56.106
db A 192.168.56.108
[root@dns named]# chmod 660 word.project.com.zone
[root@dns named]# chown :named word.project.com.zone
[root@dns named]# systemctl start named
[root@dns named]# firewall-cmd --add-service=dns --permanent
[root@dns named]# firewall-cmd --reload
[root@dns named]# nslookup
> server
Default server: 10.0.2.10
Address: 10.0.2.10#53
> db.word.project.com
Server: 10.0.2.10
Address: 10.0.2.10#53
Name: db.word.project.com
Address: 192.168.56.108
[root@server ~]# nslookup
> server
Default server: 10.0.2.10
Address: 10.0.2.10#53
> db.word.project.com
Server: 10.0.2.10
Address: 10.0.2.10#53
Name: db.word.project.com
Address: 192.168.56.108
구축한 dns서버로 질의, 응답할 수 있도록 설정
[root@server ~]# vi /etc/resolv.conf
# Generated by NetworkManager
search word.project.com
nameserver 10.0.2.10
https는 SSH과 TLS 사용ㄴ
[root@server ~]# yum -y install mod_ssl
[root@server ~]# systemctl start httpd
[root@server ~]# firewall-cmd --add-service=https
[root@server ~]# firewall-cmd --reload
[root@server ~]# cd /etc/httpd/conf.d
[root@server conf.d]# openssl genrsa -out private.key 2048
Generating RSA private key, 2048 bit long modulus
............................................................................................................................+++
......................................................................................................................................+++
e is 65537 (0x10001)
[root@server conf.d]# openssl req -new -key private.key -out cert.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:kr
State or Province Name (full name) []:admin
Locality Name (eg, city) [Default City]:seoul
Organization Name (eg, company) [Default Company Ltd]:seoul
Organizational Unit Name (eg, section) []:adm
Common Name (eg, your name or your server's hostname) []:server.word.project.com
Email Address []:admin@word.project.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@server conf.d]# openssl x509 -req -signkey private.key -in cert.csr -out cert.crt
Signature ok
subject=/C=kr/ST=admin/L=seoul/O=seoul/OU=adm/CN=server.word.project.com/emailAddress=admin@word.project.com
Getting Private key
/etc/pki/tls/keyname.key : 개인 키 600 또는 400 사용권한과 cert_t로 유지
/etc/pki/tls/certname.csr : 서명 요청할 때만 생성, CA로 보내는 파일 서명용
/etc/pki/tls/cert/cretname.crt : 공개 인증서, 자체 서명된 인증서가 요청될 때만 생성. 서명 요청이 있고 CA로 전송될 때 CA에서 반환되는 파일 644 cert_t로 유지
[root@server conf.d]# chmod 600 private.key cert.csr
[root@server conf.d]# mv private.key /etc/pki/tls/private/
[root@server conf.d]# mv cert.* /etc/pki/tls/certs/
Network File System
클라이언트 컴퓨터의 사용자가 네트워크 상의 파일을 직접 연결된 스토리지에 접근하는 방식과 비슷한 방식으로 접근하도록 도움
[root@nfs ~]# yum -y install nfs-utils
share 디렉토리에 해당 IP 접근가능, 읽기 쓰기 권한
sync -> NFS가 쓰기 작업할 때마다 디스크 동기화
[root@nfs ~]# vi /etc/exports
/share 192.168.56.*(rw,sync)
일반 사용자도 공유디렉토리에 접근 가능하도록 설정
[root@nfs ~]# mkdir /share
[root@nfs ~]# chmod 707 /share
[root@nfs ~]# cp /boot/vm* /share
[root@nfs ~]# ls /share/
vmlinuz-0-rescue-bb9afee5d305ab46b7f34ffc7d08f145 vmlinuz-3.10.0-862.el7.x86_64
nfs 서비스를 상시 가동하기 위한 설정
[root@nfs ~]# systemctl restart nfs-server
[root@nfs ~]# systemctl enable nfs-server
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
exportfs : 로컬의 디렉토리를 NFS 클라이언트로 export하거나 unexport하는 명령어
v옵션은 현재 NFS공유리스트를 출력
[root@nfs ~]# exportfs -v
/share 192.168.56.*(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
nft 서비스에 tcp가 활성화 되어 있기 때문에 udp 포트만 추가적으로 열어줌
[root@nfs ~]# firewall-cmd --permanent --add-service=nfs
[root@nfs ~]# firewall-cmd --permanent --add-port=111/udp
[root@nfs ~]# firewall-cmd --permanent --add-port=20048/udp
[root@nfs ~]# firewall-cmd --list-all
public (active)
...
services: ssh dhcpv6-client nfs
ports: 111/udp 20048/udp
...
[root@nfs ~]# cat /etc/services | grep 111/udp
sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP
[root@nfs ~]# cat /etc/services | grep 20048/udp
mountd 20048/udp # NFS mount protocol
[root@dns named]# vi word.project.com.zone
...
nfs A 192.168.56.110
showmount -e로 export된 디렉터리의 목록을 출력
[root@server ~]# showmount -e nfs.word.project.com
Export list for nfs.word.project.com:
/share 192.168.56.*
[root@server ~]# mkdir /webShare
웹서버의 디렉토리와 공유 디렉토리 연결
[root@server ~]# mount -t nfs nfs.word.project.com:/share /webShare
[root@server ~]# vi /etc/fstab
...
nfs.word.project.com:/share /webShare nfs defaults 0 0
df -T로 장치 확인
[root@server ~]# df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
...
nfs.word.project.com:/share nfs4 58690816 5528320 53162496 10% /webShare
DNS를 이용하여 도메인 정보를 조회하는 시점에서 다른 IP정보를 통해 트래픽을 분산하는 기법
NFS서버를 second web 서버로 사용
server2에도 자원을 할당 하기 위해 DNS Round Robin 사용
DNS Round Robin을 위해 TTL 값을 1로 설정
[root@dns named]# vi word.project.com.zone
...
server 1 IN A 192.168.56.106
server 1 IN A 192.168.56.110
...
[root@dns named]# systemctl restart named
하나의 도메인 질의 시, 두 개의 IP를 받아오는지 확인
[root@server ~]# nslookup
> server.word.project.com
Server: 10.0.2.10
Address: 10.0.2.10#53
Name: server.word.project.com
Address: 192.168.56.106
Name: server.word.project.com
Address: 192.168.56.110
[root@nfs ~]# vi /var/www/html/index.html
<html><body><h1>It server2</h1>
</body></html>
[root@nfs ~]# systemctl restart httpd
errOR 2002 (HY000): Can't connect to server on '*.*.*.120' (115)
웹 서버에서 데이터베이스 서버 접속 시, 연결이 불가능 하였음.
원인은 enp0s9로의 접근 자체가 불가능했던 점을 파악하지 못 하였음.
enp0s8을 사용하여 접속함으로써 해결.
웹 서버에서 데이터베이스 서버 접속 시, 각 서버의 유형 차이로 생기는 오류
각 서버에서 SELINUX 모드 해제 시 해결
[root@server ~]# setenfoce 0
[root@db ~]# setenfoce 0
Ignoring query to other database
[root@db ~]# mysql -root -p
db 접속 시, -u 옵션을 사용하지 않았음
[root@server ~]# nslookup
> server
Default server: 10.0.2.10
Address: 10.0.2.10#53
> www.nate.com
;; connection timed out; no servers could be reached
> db.word.project.com
;; connection timed out; no servers could be reached
dns 서버에서 dns 방화벽을 추가 후, reload 하지 않았음
개인서명이기 때문에 신뢰할 수 없다라고 나옴, 보안접속은 가능
[root@server ~]# showmount -e 192.168.56.110
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
111 포트를 열지 않아서 생김
[root@nfs ~]# firewall-cmd --permanent --add-port=111/udp
success
[root@nfs ~]# cat /etc/services | grep 111/udp
sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP
[root@server ~]# showmount -e 192.168.56.110
rpc mount export: RPC: Unable to receive; errno = No route to host
20048 포트를 열지 않아서 생김
[root@nfs ~]# firewall-cmd --permanent --add-port=20048/udp
success
[root@nfs ~]# cat /etc/services | grep 20048/udp
mountd 20048/udp # NFS mount protocol
세션이 계속 유지되기 때문에 발생
zone 파일에서 TTL 값을 낮춰주면 해결
[root@dns named]# vi word.project.com.zone
...
server 1 IN A 192.168.56.106
server 1 IN A 192.168.56.110
...
https://192.168.56.106 으로 접속
MariaDB [wordpress]> show tables;
+-----------------------+
| Tables_in_wordpress |
+-----------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_termmeta |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------+
12 rows in set (0.000 sec)
[root@nfs ~]# touch /share/nfstest
[root@nfs ~]# ls /share/
nfstest vmlinuz-0-rescue-bb9afee5d305ab46b7f34ffc7d08f145 vmlinuz-3.10.0-862.el7.x86_64
웹서버에서 마운트 디렉토리에 공유가 되었는가 확인
[root@server ~]# ls /webShare
nfstest vmlinuz-0-rescue-bb9afee5d305ab46b7f34ffc7d08f145 vmlinuz-3.10.0-862.el7.x86_64