리눅스 서버 구축

SunChan Kwon·2024년 6월 14일
0

Linux

목록 보기
20/20
post-thumbnail

hostnameIP주소DNS
web1192.168.10.10/24web1.sckwon.com
web2192.168.10.20/24web2.sckwon.com
masterdb192.168.10.30/24masterdb.sckwon.com
slavedb192.168.10.40/24slavedb.sckwon.com
nfs192.168.10.50/24nfs.sckwon.com
dnsserver192.168.10.60/24ns.sckwon.com
iscsi192.168.10.70/24iscsi.sckwon.com
weblb192.168.10.100/24lb-web.sckwon.com
dblb192.168.10.200/24lb-db.sckwon.com

DNS Server

Package

$ dnf install bind

$ systemctl enable --now named.service

config

$ vi /etc/named.conf

# option 수정
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";
        secroots-file   "/var/named/data/named.secroots";
        recursing-file  "/var/named/data/named.recursing";
        allow-query     { any; };

# zone 추가
zone "sckwon.com." IN {
        type master;
        file "data/sckwon.zone";
};

zone "10.168.192.in-addr.arpa" IN {
        type master;
        file "data/10.168.192.in-addr.arpa";
};
       

zone file

정방향

$TTL 3D
@       IN SOA  ns.sckwon.com. root. (
                                        20240613        ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum


@               IN      NS      ns.sckwon.com.
ns              IN      A       192.168.10.60

@               IN      NS      web1.sckwon.com.
web1            IN      A       192.168.10.10
@               IN      NS      web2.sckwon.com.
web2            IN      A       192.168.10.20

@               IN      NS      masterdb.sckwon.com.
masterdb        IN      A       192.168.10.30
@               IN      NS      slavedb.sckwon.com.
slavedb         IN      A       192.168.10.40

@               IN      NS      nfs.sckwon.com.
nfs             IN      A       192.168.10.50

@               IN      NS      iscsi.sckwon.com.
iscsi           IN      A       192.168.10.70

@               IN      NS      lb-web.sckwon.com.
lb-web          IN      A       192.168.10.100
@               IN      NS      lb-db.sckwon.com.
lb-db           IN      A       192.168.10.200

역방향

$TTL 3D
@       IN SOA  ns.sckwon.com. root. (
                                        20240613        ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@       IN      NS      ns.sckwon.com.
60      IN      PTR     ns.sckwon.com.

10      IN      PTR     web1.sckwon.com.
20      IN      PTR     web2.sckwon.com.

30      IN      PTR     masterdb.sckwon.com.
40      IN      PTR     slavedb.sckwon.com.

50      IN      PTR     nfs.sckwon.com.

70      IN      PTR     iscsi.sckwon.com.

100     IN      PTR     lb-web.sckwon.com.
200     IN      PTR     lb-db.sckwon.com.

firewall

$ firewall-cmd --add-service=dns

DB Server

Package

$ dnf install mariadb-server

# 다음 접속 시에도 사용 가능 및 심볼릭 링크 생성
$ systemctl enable --now mariadb

$ firewall-cmd --add-service=mysql

MasterDB

DB 생성

$ mysql_secure_installation 

$ mysql -u root -p

MariaDB [(none)]> create database sckwon;

MariaDB [(none)]> use sckwon;

MariaDB [sckwon]> create table student(
    -> id INT AUTO_INCREMENT PRIMARY KEY,
    -> name VARCHAR(10) NOT NULL,
    -> age INT,
    -> address VARCHAR(255) NOT NULL
    -> );

Master/Slave 이중화

MasterDB

$ vi /etc/my.cnf.d/mariadb-server.cnf
[mysqld]
autocommit=0
server-id=100
log-bin=mysql-bin

$ systemctl restart mariadb.service

# 다른 호스트에서도 접근 가능한 web_user 생성
$ MariaDB [(none)]> create user web_user@'%' IDENTIFIED BY '1234';

# master와 slave를 연결하기 위한 계정으로 설정
MariaDB [(none)]> grant replication slave ON *.* TO web_user@'%';
Query OK, 0 rows affected (0.001 sec)

# master 파일 정보 확인
MariaDB [(none)]> SHOW master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      645 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.000 sec)

# DB 복제를 위한 dump 파일 생성
$ mysqldump --all-databases -u root -p > web.dump

# scp 복제
$ scp web.dump vagrant@slavedb.sckwon.com:/tmp

SlaveDB

$ mysql_secure_installation

$ vi /etc/my.cnf.d/mariadb-server.cnf   [mysqld]
autocommit=0
server-id=101
log-bin=mysql-bin
read-only=0

$ systemctl restart mariadb.service 

# masterdb 내용 덮어쓰기
$ mysql -u root -p < /tmp/web.dump 

# master status에 맞게 CHANGE MASTER
> CHANGE MASTER TO master_host='masterdb.sckwon.com',master_user='web_user',master_password='1234',master_log_file='mysql-bin.000001',master_log_pos=645;

> START SLAVE;

slavedb에서 web.dump파일로 덮어씌움

이중화 정상 완료된 것을 SLAVE STATUS에서 확인

MasterDB에 데이터를 입력하고 commit 하면 SlaveDB에도 같은 데이터가 삽입 되는 것을 확인

trouble shooting

selinux

selinux가 설정되어 웹 서버에서 데이터를 불러오지 못할 수 있어 다음 명령어로 해결함.

$ setsebool httpd_can_network_connect_db on

web Server

package

$ dnf install httpd
$ systemctl enable --now httpd


$ dnf install -y php php-mysqlnd
$ systemctl enable --now php-fpm.service

$ dnf install -y mariadb-server

firewall

$ firewall-cmd --list-all
services: cockpit dhcpv6-client dns http https mysql ssh

DB 서버에서 데이터 불러오기

# php 파일에 아래와 같이 db에 접근하기 위한 정보를 입력하고, 쿼리문, 틀을 짜주면 데이터를 불러올 수 있다.
$servername = "masterdb.sckwon.com";
$username = "web_user";
$password = "1234";
$dbname = "sckwon";
.
.
$query = "SELECT * FROM web_tab";
.
.
if (mysqli_num_rows($rst) > 0) {
  while($i = mysqli_fetch_assoc($rst)) {
    echo "id : "  .  $i["id"]  .  " | name : "  .  $i["name"]  .  "<br>" ;
  }
}
..생략..

웹브라우저에서 접속 하여 정상 작동 확인


HAProxy

weblb

package

$ dnf install haproxy

config

$ vi /etc/haproxy/haproxy.cfg
frontend main
    bind *:80
    .
    .
    .
backend app
   balance     roundrobin
   server  app1 web1.sckwon.com:80 check
   server  app2 web2.sckwon.com:80 check

firewall

$ firewall-cmd --add-service=http

web server php 코드의 servername을 web로드밸런서의 도메인으로 변경

접속 테스트

proxy 서버에서 localhost로 조회

client 서버에서 도메인으로 조회


dblb

config

$ vi /etc/haproxy/haproxy.cfg
defaults
    mode                    tcp
    log                     global
    option                  tcplog
    .
    .
frontend main
    bind *:3306
    .
    .
backend app
    balance     roundrobin
    server  app1 masterdb.sckwon.com:3306 check
    server  app2 slavedb.sckwon.com:3306 check

selinux

$ setsebool haproxy_connect_any on

firewall

$ firewall-cmd --add-service=mysql

webserver의 php 코드 servername을 db로드밸런서 도메인으로 변경

정상 작동 확인


nfs Server

package

$ dnf install nfs-utils

web file

# web서버에 작성한 파일을 nsf서버로 복제
[root@web1 ~]# scp /var/www/html/* nfs.sckwon.com:/share_php
root@nfs.sckwon.com's password: 
get_student_data.php   100% 1546     2.6MB/s   00:00    
index.html             100%   13    28.1KB/s   00:00     
index.php              100% 5079    10.9MB/s   00:00 

export 설정

$ cat /etc/exports
/share_php      web1.sckwon.com(rw,sync)
/share_php      web2.sckwon.com(rw,sync)

$ exportfs -r

web server

$ dnf install nfs-utils

$ dnf install autofs
$ systemctl enable --now autofs

$ vi /etc/auto.master.d/direct.autofs
/-      /etc/auto.direct

$ vi /etc/auto.direct
/var/www/html   -rw,sync        nfs.sckwon.com:/share_php

$ ls /var/www/html/
get_student_data.php  index.html  index.php

firewall

$ firewall-cmd --add-service=nfs

selinux

$ setsebool httpd_use_nfs on

브라우저에서 접속



기존에는 web2 서버에 웹 코드 파일이 없었기 때문에 로드밸런서의 ip로 접근했을 때 정상 페이지(web1)와 File not found.(web2)가 번갈아가며 출력되었다.



현재는 웹 브라우저에서 새로고침을 하면 haproxy에 설정한 대로 roundrobin방식으로 번갈아가며 페이지가 출력된다

아직 web1에는 nfs 마운트를 하지 않아 기존 페이지가 출력되는 상태로 web1 서버에도 같은 작업을 해주면 같은 페이지가 두 서버를 번갈아가며 출력된다.


iscsi server


iscsi 서버의 /dev/sdb를 이용하여 iscsi 서버에서 원격으로 db 서버 두 개의 db 저장소 제공 목적

partitioning


fdisk 명령을 이용, sdb에 논리볼륨 두 개를 생성

package

$ dnf install targetcli-2.1.57-2.el9.noarch 
$ systemctl enable --now targetclid.service 

targetcli

$ targetcli

# 블록 생성
/> /backstores/block create name=masterdb-block dev=/dev/sdb5
/> /backstores/block create name=slavedb-block dev=/dev/sdb6

# iqn 주소 생성
/iscsi> create iqn.2024-06.com.sckwon.iscsi:target

# LUN 각각 생성
/> iscsi/iqn.2024-06.com.sckwon.iscsi:target/tpg1/luns create /backstores/block/masterdb-block 
/> iscsi/iqn.2024-06.com.sckwon.iscsi:target/tpg1/luns create /backstores/block/slavedb-block 

# acl 각각 생성
/> iscsi/iqn.2024-06.com.sckwon.iscsi:target/tpg1/acls create iqn.2024-06.com.sckwon.masterdb:initiator
/> iscsi/iqn.2024-06.com.sckwon.iscsi:target/tpg1/acls create iqn.2024-06.com.sckwon.slavedb:initiator

$ systemctl enable target.service 

 

firewall

$ firewall-cmd --add-service=iscsi-target

client

package

$ dnf install -y iscsi-initiator-utils
$ systemctl enable --now iscsi

config

$ vi /etc/iscsi/initiatorname.iscsi 
# masterdb
InitiatorName=iqn.2024-06.com.sckwon.masterdb:initiator

# slavedb
InitiatorName=iqn.2024-06.com.sckwon.slavedb:initiator 

mount

$ iscsiadm -m discovery -t st -p iscsi.sckwon.com

$ iscsiadm -m node -T iqn.2024-06.com.sckwon.iscsi:target -l

$ mkfs -t xfs /dev/sdb

$ vi /etc/fstab
/dev/sdb /var/lib/mysql xfs     _netdev        0 0

마운트된 디렉토리로 mysql(/var/lib/mysql)데이터 복원


마운트 후에도 db 정상작동 확인

$ ls -ldZ /var/lib/mysql/
drwxr-xr-x. 5 root root system_u:object_r:unlabeled_t:s0 4096 Jun 14 02:01 /var/lib/mysql/
$ restorecon -Rv /var/lib/mysql/

$ ls -ldZ /var/lib/mysql/
drwxr-xr-x. 5 root root system_u:object_r:mysqld_db_t:s0 4096 Jun 14 02:01 /var/lib/mysql/

trouble shooting

[root@MasterDB ~]# mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)

마운트 후 복원 파일에 대해 mysql에 접근할 수 없는 오류 발생

$ systemctl stop mysqld
$ restorecon -Rv /var/lib/mysql/
$ chmod -R 755 /var/lib/mysql/
$ chown -R mysql:mysql /var/lib/mysql/
$ systemctl start mysqld

권한 및 소유그룹을 수정하여 해결

오류 메시지

해결 후 정상 작동 중

masterdb에서 데이터 삽입 후 slavedb에서 생성된 것 까지 확인

ssl

인증 관련 파일은 vi /etc/httpd/conf.d/ssl.conf의 내용과 위치가 일치해야한다.

# 개인 키 생성
$ openssl genrsa -out /etc/pki/tls/private/private.key 2048

# csr 생성
$ openssl req -new -key /etc/pki/tls/private/private.key -out /etc/pki/tls/private/private.csr

# x.509표준을 따르는 인증서 생성 
$ openssl x509 -req -signkey /etc/pki/tls/private/private.key -in /etc/pki/tls/private/private.csr -out /etc/pki/tls/private/cert.crt

$ bash -c 'cat /etc/pki/tls/private/private.key /etc/pki/tls/private/cert.crt >> /etc/haproxy/certs/private.pem        
'

config

$ vi /etc/haproxy/haproxy.cfg
frontend main
    bind *:80
    bind *:443 ssl crt /etc/haproxy/certs/private.pem
    
$ systemctl restart haproxy.service

firewall

$ firewall-cmd --add-service=https

https로 접속

0개의 댓글