본문 바로가기

Vagrant

[Vagrant] 02. Vagrant를 활용해서 자동으로 서버 생성 심화 - HAProxy서버, 서버 이중화, DB서버 분리

반응형

# 구축 설계 도안 

아키텍처

 

 

# 0. 기존 가상 머신 삭제 (powershell)

vagrant destroy

 

 

# 1. 새로운 서버 구축을 위한 Vagrantfile(script 파일) 작성

: 메모장에 아래 코드 붙여넣고 Vagrantfile 이름으로 '바탕화면'에 저장(.txt 확장자 부분 삭제)

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  config.vm.define "WP-LB01" do |config|
    config.vm.box = "rockylinux/9"
    config.vm.network "private_network", ip: "192.168.56.10"
    config.vm.network "private_network", ip: "192.168.57.10"
    config.vm.synced_folder ".", "/vagrant", disabled: true
    config.vm.provider "virtualbox" do |vb|
      vb.memory = "2048"
      vb.cpus = 2
      vb.name = "WP-LB01"
    end
    config.vm.hostname = "WP-LB01"
  end

  config.vm.define "WP-WEB01" do |config|
    config.vm.box = "rockylinux/9"
    config.vm.network "private_network", ip: "192.168.57.11"
    config.vm.network "private_network", ip: "192.168.58.11"
    config.vm.synced_folder ".", "/vagrant", disabled: true
    config.vm.provider "virtualbox" do |vb|
      vb.memory = "2048"
      vb.cpus = 2
      vb.name = "WP-WEB01"
    end
    config.vm.hostname = "WP-WEB01"
  end

  config.vm.define "WP-WEB02" do |config|
    config.vm.box = "rockylinux/9"
    config.vm.network "private_network", ip: "192.168.57.12"
    config.vm.network "private_network", ip: "192.168.58.12"
    config.vm.synced_folder ".", "/vagrant", disabled: true
    config.vm.provider "virtualbox" do |vb|
      vb.memory = "2048"
      vb.cpus = 2
      vb.name = "WP-WEB02"
    end
    config.vm.hostname = "WP-WEB02"
  end

  config.vm.define "WP-DB01" do |config|
    config.vm.box = "rockylinux/9"
    config.vm.network "private_network", ip: "192.168.58.13"
    config.vm.synced_folder ".", "/vagrant", disabled: true
    config.vm.provider "virtualbox" do |vb|
      vb.memory = "2048"
      vb.cpus = 2
      vb.name = "WP-DB01"
    end
    config.vm.hostname = "WP-DB01"
  end

end

 

 

# 2. vagrant로 가상머신 생성(powershell)

# powershell 프로그램 실행 후에

./com/desktop   #경로 이동
ls   # 해당경로(바탕화면)에 Vagrantfile 있는지 확인

vagrant up   # vagrant 실행

 

 vagrant up 끝나면 virtual box에 Vagrant script로 작성한 서버 4개가 올라온 것을 확인할 수 있습니다.

 

# 3. 서버 IP설정 수정(virtual box)

: 파일 > 도구 > 네트워크 관리자 > 192.168.56.1 클릭 > DHCP 서버 활성화 클릭 해제 > 적용

 

192.168.56.1/24 는 자동으로 할당해주는 IP 이고,  192.168.57.1/24는 위에서 Vagrantfile 로 지정해준 IP 입니다.

 

57과 58 대역대 통신이 가능한지 확인을 미리 해줍니다.

 

# 4. 서버 구축(powershell)

4-1. WEB01 & 02  (Web server) 

1. 필요 패키지 설치(httpd, php, php-mysqlnd)

2. httpd 서비스 활성화

3. 방화벽 설정

4. 워드프레스 설치

5. 워드프레스 권한 설정

6. 워드프레스 DB 연동

7. 가상호스트 세팅

8. Web → DB 접근 가능 selinux 설정

vagrant ssh WP-WEB01   # WP-WEB01에 접속

# 1. 필요 패키지 설치
[vagrant@WP-WEB01 ~]$ sudo dnf -y install httpd php php-mysqlnd   

# 2. httpd 서비스 실행
[vagrant@WP-WEB01 ~]$ sudo systemctl enable httpd --now    

# 3. 방화벽 설정
[vagrant@WP-WEB01 ~]$ sudo systemctl enable firewalld --now   # 방화벽 실행
[vagrant@WP-WEB01 ~]$ sudo firewall-cmd --permanent --add-service=http   # 방화벽 서비스 포트 추가
[vagrant@WP-WEB01 ~]$ sudo systemctl restart firewalld   # 재시작해서 업데이트
# or sudo firewall-cmd --add-service=http  (현재 창에도 업로드 시켜야하기 때문에)

# 확인
# sudo firewall-cmd --list-all
# sudo firewall-cmd --list-all --permanent

 

!여기서 잠깐! enable 할때 나오는 심볼릭링크!

# 심볼릭링크 사용 목적?( ls -ld /bin )
1. 바로가기 역할. 원본파일은 두고 이름을 죽이고자 할때, 혹은 의미있는 이름으로 바꾸고 사용하려고 할때
2. 파일의 경로가 복잡하게 깊숙히 있는경우 원하는 위치로 끌어내고자 할때 

ls -ld /bin

 

sudo systemctl restart firewalld

 

# 4. 워드프레스 설치
#sudo su 로 권한 바꿔줘도 됨
[vagrant@WP-WEB01 ~]$ sudo curl -o wordpress.tar.gz https://wordpress.org/wordpress-6.3.2.tar.gz  # wordpress 다운
# curl -o / wget 비슷한 역할. but wget는 전체 url을 다 써줘야하고, 
# curl -o 는 축약 url을 써줘도 되고, 다운로드시 파일 명도 원하는대로 지정 가능하다.
[vagrant@WP-WEB01 ~]$ sudo tar xzf wordpress.tar.gz -C /var/www/html/
# -C 옵션을 쓰면 위치를 직접 지정해서 추출 가능! # /var/www/html/ 에 압축파일을 풀어라~


# 5. 워드프레스 권한 설정 (httpd와의 원활한 연동을 위해)
[vagrant@WP-WEB01 ~]$ sudo chmod -R 775 /var/www/html/wordpress/   # 권한 변경
[vagrant@WP-WEB01 ~]$ sudo chown -R apache.apache /var/www/html/wordpress/   # 아파치의 소유권으로 변경
# apache 관리자가 관리하는 것이 root 사용자가 관리하는 것보다 더 효율적이다.
# httpd 랑 wordpress를 연결해야하니까, httpd의 관리자인 apache 관리자로 변경해주는 것이 일이 수월?하다.

[vagrant@WP-WEB01 ~]$ sudo ls -ld /var/www/html/wordpress/
[vagrant@WP-WEB01 ~]$ sudo ls /var/www/html/wordpress/

권한 부여

 

* tar 에서 -xzf 와 그냥 xzf 의 차이

 

 

 

#  워드프레스 DB 연동

# 설정 파일 복사
[vagrant@WP-WEB01 ~]$ sudo cp /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php

## wordpress 설정 파일 변경 - 데이터베이스 정보 입력
[vagrant@WP-WEB01 ~]$ sudo sed -i "s/define( 'DB_NAME', '.*' );/define( 'DB_NAME', 'wp' );/" /var/www/html/wordpress/wp-config.php
#  sed -i : 치환 명령어, / 기준으로 앞의 내용을 뒤에 내용으로 바꿔줌, 맨끝엔 출처(위치및파일명)
# s/ : 문자열이니까,  '.*' : 뭐라고 써있던지 간에
# 이걸로 DB_USER, DB_PASSWORD, DB_HOST 모두 변경해주기
# sudo sed -i "s/define( 'DB_USER', '.*' );/define( 'DB_USER', 'wp-user' );/" /var/www/html/wordpress/wp-config.php
# sudo sed -i "s/define( 'DB_PASSWORD', '.*' );/define( 'DB_PASSWORD', 'P@ssw0rd' );/" /var/www/html/wordpress/wp-config.php
# sudo sed -i "s/define( 'DB_HOST', '.*' );/define( 'DB_HOST', '192.168.58.13' );/" /var/www/html/wordpress/wp-config.php


# 가상호스팅 세팅
가상 호스트 설정은 Apache 웹 서버에서 여러 개의 웹사이트를 호스팅할 수 있도록 하는 것
#Apache 웹 서버의 설정  파일 옵션 수정 
# * 설정 디렉토리 활용 : 분리해서 깔끔하게 정리
# conf/httpd.conf 가 아닌, conf.d 폴더의 wordpress.conf 설정파일에서 경로 수정

sudo tee /etc/httpd/conf.d/wordpress.conf << EOF
# EOF : EOF란 단어가 나올 때까지 입력하겠다는 의미
# 아래 텍스트 입력 후 EOF 입력, enter!

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html/wordpress
    <Directory "/var/www/html/wordpress">
        AllowOverride All
    </Directory>
</VirtualHost>
EOF


$ sudo systemctl restart httpd

# selinux 설정

[vagrant@WP-WEB01 ~]$ sudo setsebool -P httpd_can_network_connect_db 1
# SELinux(Security-Enhanced Linux) 정책을 설정하는 것
# http가 데이터베이스로 접근할 수 있는  selinux 설정

# setsebool: SELinux 부울린 변수의 값을 설정하는 명령어
# -P: 이 옵션은 변경 사항을 현재와 영구적으로 저장을 같이하는 것. 시스템 재부팅 후에도 적용
# httpd_can_network_connect_db: 이 SELinux 부울린 변수는 Apache HTTP 서버가 데이터베이스에 네트워크로 연결할 수 있도록 허용하는 것을 의미
# 1: 이 값은 true를 의미

exit

 

 

 

 

# # wp - web01(db작업) / wp - web02(haproxy작업)

# wp - web01(db작업)

1. 필요 패키지 설치( mysql-server )

2. 서비스 활성화

3. 방화벽 실행 및 설정

4. root 비밀번호 변경 / 이름없는 사용자 제거 / 원격 root 사용자 제거

5. wp 데이터 베이스 생성

6. wp-user 사용자 생성

7. wp-user 사용자에게 모든 권한 부여

vagrant ssh WP-DB01   # WP-WEB01에 접속

# 1. 필요 패키지 설치
[vagrant@WP-WEB01 ~]$ sudo dnf -y install mysql-server   

# 2. httpd 서비스 실행
[vagrant@WP-WEB01 ~]$ sudo systemctl enable mysqld --now    

# 3. 방화벽 설정
[vagrant@WP-WEB01 ~]$ sudo systemctl enable firewalld --now   # 방화벽 실행
[vagrant@WP-WEB01 ~]$ sudo firewall-cmd --permanent --add-service=mysql   # 방화벽 서비스 포트 추가
[vagrant@WP-WEB01 ~]$ sudo firewall-cmd --reload   # 재시작해서 업데이트
# = systemctl restart firewalld
# = sudo firewall-cmd --add-service=mysql  (현재 창에도 업로드 시켜야하기 때문에)

# 확인
# sudo firewall-cmd --list-all
# sudo firewall-cmd --list-all --permanent

# 4. root 비밀번호 변경 / 이름없는 사용자 제거 / 원격 root 사용자 제거

# 4-1. root 사용자 비밀번호 설정
[vagrant@WP-WEB01 ~]$ mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'P@ssw0rd';"
# = mysql_secure_installation  : 전문가 모드로 변경해서 설정
# -e : 다음에 오는 문자열을 MySQL 명령어로 실행하라

# 4-2. 익명 사용자 제거(이름이 없는 사용자)
# : 사용자 칸에 빈칸으로 하면, 이름 없는 사용자도 로그인이 가능하다. > 그걸 제한해줄거임
[vagrant@WP-WEB01 ~]$ mysql -u root -pP@ssw0rd -e "DELETE FROM mysql.user WHERE User='';"
# -pP@ssw0rd  : -p 다음에 띄어쓰기 없이 비번 입력


# 4-3. 외부에서 접근 가능한 root 사용자 제거(원격 사용자 제한, 로컬에서만 접근 가능)
[vagrant@WP-WEB01 ~]$ mysql -u root -pP@ssw0rd -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
# 여기 적은 root 사용자들 빼고는 다 지울거야, root로는 다 못들어오게 할거야. 라는 뜻.
# '127.0.0.1' : IPV4의 루프백(자기자신)
# '::1' : IPV6의 루프백(자기자신)
=> root 는 원격제한해도 되는 이유, 일반 사용자한테 모든 권한을 넘겼기에 일반사용자로 원격접속하면 됨!

 

# 5. 데이터베이스 생성
[vagrant@WP-WEB01 ~]$ mysql -u root -pP@ssw0rd -e "CREATE DATABASE wp;"

# 6. wp-user 유저 생성 및 비번 설정
[vagrant@WP-WEB01 ~]$ mysql -u root -pP@ssw0rd -e "CREATE USER 'wp-user'@'192.168.58.0/24' identified by 'P@ssw0rd';"
# 'root' 사용자로 MySQL에 접속하여, '192.168.57.0/24' 네트워크 대역에서 접속 가능한 'wp-user'라는 새로운 사용자를 생성하라
# identified by : 사용자 생성시 사용자의 비밀번호를 설정

# 7. wp-user 유저에게 모든 권한부여
# : DB에서 SELECT, DELETE 등 사용 가능하도록 권한 부여
[vagrant@WP-WEB01 ~]$ mysql -u root -pP@ssw0rd -e "GRANT ALL PRIVILEGES ON wp.* TO 'wp-user'@'192.168.58.0/24' WITH GRANT OPTION;"
# PRIVILEGES ON : 자동 갱신
# GRANT ~ TO  /  REVOKE ~ FROM
# 4~7. 데이터베이스 생성 방법2

$ mysql -u root
mysql> ALTER USER 'root'@'localhost' identified with mysql_native_password by 'P@ssw0rd';  # 사용자 비밀번호 설정
mysql> DELETE FROM mysql.user WHERE User='';  # 익명사용자 제거
mysql> DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); # 원격 사용자 제거
mysql> CREATE DATABASE wp;   # 데이터베이스 생성
mysql> CREATE USER 'wp-user'@'192.168.58.0/24' identified by 'P@ssw0rd';   #  wp-user 유저 생성 및 비번 설정
mysql> FLUSH PRIVILEGES;   # wp-user 유저에게 모든 권한부여

 

 

# wp - web02(haproxy작업)

1. 필요 패키지 설치( haproxy )

2. 서비스 활성화

3. 방화벽 실행 및 설정

4. 로드밸런서 설정 - 포트포워딩(컨테이너에서도 추후 사용됨)

vagrant ssh WP-LB01   # WP-WEB01에 접속

# 1. 필요 패키지 설치
[vagrant@WP-WEB01 ~]$ sudo dnf -y install haproxy    

# 2. httpd 서비스 실행
[vagrant@WP-WEB01 ~]$ sudo systemctl enable haproxy --now    

# 3. 방화벽 설정
[vagrant@WP-WEB01 ~]$ sudo systemctl enable firewalld --now   # 방화벽 실행
[vagrant@WP-WEB01 ~]$ sudo firewall-cmd --permanent --add-port=80/tcp --add port=8080/tcp    # 방화벽 서비스 포트 추가
[vagrant@WP-WEB01 ~]$ sudo firewall-cmd --reload   # 재시작해서 업데이트
# = systemctl restart firewalld
# = sudo firewall-cmd --add-port=80/tcp --add port=8080/tcp  (현재 창에도 업로드 시켜야하기 때문에)

# 확인
# sudo firewall-cmd --list-all
# sudo firewall-cmd --list-all --permanent

 

# 4. 로드밸런서 설정 - 포트포워딩(컨테이너에서도 추후 사용됨)

# sudo vi /etc/haproxy/haproxy.cfg
sudo tee /etc/haproxy/haproxy.cfg << EOF
# Global settings
global
    log         127.0.0.1 local2
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

# Default settings
defaults
    mode                    http
    log                     global
    option                  httplog
    retries                 3
    timeout http-request    10s
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    maxconn                 3000

# HAProxy Monitoring Config
listen haproxy3-monitoring
    bind *:8080
    mode http
    option forwardfor
    option httpclose
    stats enable
    stats show-legends
    stats refresh 5s
    stats uri /admin
    stats realm Haproxy\ Statistics
    stats auth admin:@dmin
    stats admin if TRUE

# Frontend Configuration
frontend main
    bind *:80
    default_backend app

# Backend Configuration
backend app
    balance roundrobin
    server WEB1 192.168.57.11:80 check
    server WEB2 192.168.57.12:80 check
sudo systemctl restart haproxy

 

 


문제1

haproxy.cfg에서 설정해준 id/pw를 기입 (admin/@dmin)
wp-config.php 파일이 없음..!!! 이게 왜 없지..

 

추가해주고 다시 해보자
정상작동 굳!


 

오늘은 심화된 내용을 다뤄보았습니다. 감사합니다. 

반응형