삽질/개발,엔지니어링

개인 사이트 개발 환경 구축

maengis 2021. 12. 18. 23:36

개인 사이트를 국내 웹호스팅에서 AWS로 옮긴 뒤로 개발 환경을 개인 서버에 구축 했었는데, 당시 개인PC에 라이젠이 가상 환경을 제대로 지원을 못해서 어쩔 수 없는 선택이었다.

바이오스 업데이트 이후에 버츄얼박스가 정상 동작하는 걸 4년 전에(...) 확인은 했으나 굳이 개발 환경을 바꿔야 되나 하는 생각이 들어서(사실 귀찮아서) 하지 않다가, 록키리눅스 8.5가 나오게 되면서 한 번 써볼까 하는 생각으로 겸사겸사 로컬 개발 환경을 구축하게 되었다.

 

장치 > 게스트 확장 CD 이미지 삽입...이 되어 있다는 가정하에

 

mount /dev/cdrom /mnt
cd /mnt
./VBoxLinuxAdditions.run

 

관련 패키지나 모듈이 다 설치 되어 있으면 위 커맨드 실행 후 별다른 오류는 없을 텐데, 리눅스 설치하면서 필요한 거만 설치하겠다고 이거저거 제외시켰더니 오류가 나서 리눅스 설치를 두세 번 해야했다. 여튼 별 문제 없이 설치 했고

 

 

 

공유 폴더도 정상적으로 마운트 되었다. 전에는 마운트를 따로 해줘야 했었는데, 마운트 지점이란 게 생겨서 뭔가 했더니 알아서 마운트까지 해줬다. 별도로 마운트를 해줘야 한다면

 

mount -t vboxsf 버츄얼박스에서입력한폴더이름 마운트할경로

 

위 커맨드로 하면 된다. (자동마운트를 하면 root.vboxsf이기도 하고 httpd가 실행 되는 것보다 늦어서 자동마운트를 해제하고 rc.local에 위 커맨드를 등록해서 마운트 되게 했다. 같은 이유로 httpd나 nginx 등도 systemctl enable을 사용하지 않았다. 기존에도 마운트 후에 실행이 되어야 해서 VirtualBox 사용시 systemctl enable을 사용 안 했었다. rc.local이 실행 안 되는 경우가 있다면, /etc/rc.d/rc.local에 실행 권한이 있나 확인해 보면 된다.)

 

나는 hosts 파일을 수정해서 임의로 지정한 도메인으로 접속시 개인 환경으로 접속을 하려고 가상 머신에 고정IP를 부여했다. ifconfig를 사용하면 보통 아래처럼 결과가 나올 텐데

 

# ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.31  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::a00:27ff:fecc:6a4a  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:cc:6a:4a  txqueuelen 1000  (Ethernet)
        RX packets 17828  bytes 15682966 (14.9 MiB)
        RX errors 0  dropped 1482  overruns 0  frame 0
        TX packets 1720  bytes 132990 (129.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1336  bytes 80160 (78.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1336  bytes 80160 (78.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

 

위에는 IP를 고정한 상태라 192.168.0.31이 나오는데, 처음에는 192.168.0.33이었다.

enp0s3가 수정해야 할 대상이라

 

cd /etc/sysconfig/network-scripts/

 

이동 후에 ls -alt나 ll로 확인하면 ifcfg-enp0s3가 있을 거다.(이건 ifconfig로 뭘 수정해야 되는 건지 확인하면 된다.)

BOOTPROTO가 dhcp로 되어 있다면, 이걸 static으로 수정하고, 아래 항목을 추가(또는 수정)해서 IP를 고정 시키면 된다.

 

BOOTPROTO=static
IPADDR=192.168.0.31
NETMARK=255.255.255.0
GATEWAY=192.168.0.1

 

개인 사이트는 웹호스팅을 쓸 때는 Apache + PHP + MySQL 구성이라 그에 맞게 개발이 되었다가 AWS로 옮기는 김에 리액트를 사용했어서 Nginx + PHP(fpm) + MariaDB 조합으로 개인 사이트와 가계부까지 같이 돌렸는데, 개인적인 용도로 쓰는 거라 리액트가 오히려 불편한 상황(가끔 서버에 직접 들어가서 vi로 수정하고 그래서)이 생겨서 리액트로 변경하기 전에 쓰던 방식대로 사용하려고 Apache도 사용하게 됐다.

여튼 개인 사이트는 Nginx > Apache로 접근하고, 가계부는 Nginx > PHP-fpm으로 접근하는 방식이라 용도가 겹침에도 둘 다 설치를 해야했다.(버전을 동일하게 맞추는 게 좋겠지만, 큰 차이가 없어서 그냥 yum으로 설치했다.)

 

yum install httpd
yum install nginx
yum install php
yum install mariadb-server

 

로컬에서 접근시 위에서 고정 IP로 지정한 192.168.0.31을 쓸 수도 있지만, 편의상 hosts 파일을 수정해서 도메인을 지정해주었다.

 
C:\Windows\System32\drivers\etc\hosts
192.168.0.31 local-maengis.com
 
* 윈도우의 경우에는 관리자 권한으로 수정을 해야해서, 메모장을 관리자 권한으로 실행 후에 해당 경로로 이동해서 hosts 파일을 열면 된다.

 

1. Apache(httpd) 설정

Nginx를 통해 Apache로 접근하기 때문에 Apache 설정부터 먼저 해준다.

/etc/httpd/conf/httpd.conf

yum으로 설치했다면, 위 경로의 파일이 설정 파일이고, 아래 항목들을 상황에 맞게 수정해주었다.

 

Listen 80

DocumentRoot "/var/www/html"

<Directory "/var/www">

<Directory "/var/www/html">
    AllowOverride All

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

<IfModule mod_rewrite.c>
    rewriteEngine On
</IfModule>

 

수정 후

 

systemctl start httpd

 

를 했을 때, journalctl -xe로 확인해보라고 나올 수 있는데, 확인시
SELinux is preventing /usr/sbin/httpd from

같은 문구가 보인다면,

 

setenforce 0

 

위 명령어로 SELinux를 꺼주면 된다. 로컬 개발 환경이라 굳이 켜둘 필요가 있나 싶어서 그냥 꺼버렸다. (iptables도 필요하지 않으니 iptables -F로 꺼버렸다.)

 

하지만 가상 머신이 켜질 때마다 계속 하는 건 귀찮으니까 CentOS8/록키리눅스8.5 기준으로

 

vi /etc/selinux/config

SELINUX=disabled

 

SELinux를 사용 안 하게 해놨음에도 외부에서 아예 접근이 안 되었다. 서버내에서 접근하면 403이 뜨기라도 하는데, 아예 8000 포트로 접근도 안 되고 /etc/httpd/logs/access_log 로그에도 서버내에서 접근한 것만 보였다.

개발 PC에서 접근한 내용은 httpd쪽 로그에 안 남아서 tcpdump로 확인해보니 8000 포트에 접근은 되었다.

 

[root@localhost logs]# tcpdump -i enp0s3 -q dst port 8000
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
18:58:34.111703 IP 192.168.0.2.8238 > local-maengis.com.irdmi: tcp 0
18:58:34.362656 IP 192.168.0.2.8239 > local-maengis.com.irdmi: tcp 0
18:58:35.111635 IP 192.168.0.2.8238 > local-maengis.com.irdmi: tcp 0
18:58:35.362690 IP 192.168.0.2.8239 > local-maengis.com.irdmi: tcp 0
18:58:37.112132 IP 192.168.0.2.8238 > local-maengis.com.irdmi: tcp 0
18:58:37.363247 IP 192.168.0.2.8239 > local-maengis.com.irdmi: tcp 0
18:58:41.113911 IP 192.168.0.2.8238 > local-maengis.com.irdmi: tcp 0
18:58:41.364028 IP 192.168.0.2.8239 > local-maengis.com.irdmi: tcp 0

 

SELinux도 끄고, iptables도 껐는데 내부에서만 접근이 된다...? 또 뭐가 있나 해서 검색을 해보니

https://foxydog.tistory.com/78

 

Rocky Linux - Firewall 방화벽

Rocky Linux - Enable Firewall Firewall Rocky Linux에서는 기본 패키지로 제공하는 네트워크 방화벽 프로그램입니다. 방화벽은 기본적으로 외부의 침입을 막기 위해 실행되며, 콘솔이 아닌 외부에서 원격 접

foxydog.tistory.com

 
이 글을 보게 되었다. 꺼주니 정상적으로 잘 접근이 된다.
 
# 설치 되어 있는지 확인
[root@localhost ~]# rpm -qa | grep firewall
python3-firewall-0.9.3-7.el8.noarch
firewalld-filesystem-0.9.3-7.el8.noarch
firewalld-0.9.3-7.el8.noarch

# 실행 되어 있는지 확인
[root@localhost ~]# ps -ef | grep firewalld
root        1015       1  0 09:30 ?        00:00:00 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid
root        9557    1854  0 09:43 pts/0    00:00:00 grep --color=auto firewalld

# 해제
systemctl stop firewalld
systemctl disable firewalld
 
기존에 PHP로 개발하면서 필요했던 것들을 설치해주었다. 몇 개 더 있는데, 록키리눅스에서는 yum에서 해당 패키지들을 찾을 수 없었다.
 
yum install php-devel php-gd php-json php-mbstring php-opcache php-pear php-pecl-apcu php-pecl-zip php-soap php-xml php-xmlrpc php-mysqlnd php-simplexml
 
.htaccess로 PHP_FLAG와 PHP_VALUE를 사용했는데,
.htaccess: Invalid command 'PHP_FLAG', perhaps misspelled or defined by a module not included in the server configuration, referer: http://local-maengis.com/
위 오류 때문에 그냥 .htaccess에서는 PHP_FLAG와 PHP_VALUE 내용을 제거하고 php.ini를 생성해서 필요한 설정을 넣어줬다. .htaccess가 저장소에 반영 되고 있던 상황이라 추적 중지하고 같은 이유로 php.ini도 빼줬다.
 
systemctl start httpd
systemctl start nginx
 

DB는 매일 실서버에서 백업을 하고, 그걸 개인 서버에 다시 백업을 하고 있어서 그걸 사용했다. MariaDB에 계정 생성 및 권한 부여만 해주고 백업 파일 그대로 밀어 넣었다.

 

systemctl start mariadb

/usr/bin/mysqladmin -u root password '비밀번호'

mysql -u root -p

create database 데이터베이스명;
create user '계정명'@'localhost' identified by '비번';
grant all privileges on 데이터베이스명.* to 계정명@localhost;
flush privileges;

 mysql -uroot -p < 백업파일

 

고통의 시간이 조금 있긴 했지만, 여튼 로컬 개발 환경을 구축했다.

 

 

문제가 하나 있는데, 로그인을 페이스북으로 해놔서 로컬은 어쩔 수 없이 내 계정으로 무조건 로그인을 하게 해야 된다는 거였다. 이건 그때그때 소스 고쳐가면서 하던가 따로 방안을 마련해야겠다.

반응형