통합검색
로그인
회원가입
Open menu
로그인
회원가입
통합검색
Synology
7
AWS
5
Linux
30
PHP
9
Python
3
Javascript
24
HTML / CSS
12
ETC
4
떡볶이집앞 사진관
Synology
7
AWS
5
Linux
30
PHP
9
Python
3
Javascript
24
HTML / CSS
12
ETC
4
떡볶이집앞 사진관
Linux
[centOS] 두대의 MariaDB 서버간 데이터베이스 동기화 (replication) 처리
두대의 MariaDB 서버간 데이터베이스를 동기화(replacation) 방법을 안내한다. (replication은 DBMS의 부하분산 환경을 구축할 때 유용하다.) 두대의 서버 중 데이터베이스의 데이터를 보내줄 서버를 'master', 데이터를 받을 서버를 'slave'라 칭한다. 두 서버간 replicatin 원리는 master 서버에서 수시로 mariadb 로그 내용을 binary로 slave에 전달하고, slave는 이 로그 내용을 토대로 변경된 작업 내역이 있다면 동일하게 slave에서도 처리하게 되는 원리다. master - 동기화할 DB 및 계정 생성 가장 먼저 replication 시킬 DB를 생성한다. #mysql -u root -p 로 mysql에 접속한다. MariaDB [(none)] > use mysql; Mysql에 접속 되면 위와 같이 mysql DB를 선택한다. MariaDB [(mysql)] > create database testdb default character set utf8; testdb 데이터베이스를 생성한다. MariaDB [(mysql)] > create user testuser@'%' identified by 'password'; testdb 데이터베이스에 접속할 새로운 아이디를 생성한다. 이 때 slave(외부 서버)에서 접속 가능해야 하기 때문에 '%'로 외부 접속을 허용해야 한다. MariaDB [(mysql)] > grant replication slave on *.* to 'testuser'@'%' identified by 'password'; 방금 생성한 testuser에게 replacation 권한을 부여한다. master - replication 활성화를 위한 my.cnf 설정 replication 활성화를 위해 master 서버의 mariadb 설정을 수행한다. #vi /etc/my.cnf mariaDB 설정 파일인 my.cnf를 vi 로 연다. [mysqld] log-bin=mysql-bin server-id=1 [mysqld] 부분을 찾거나, 없다면 추가하여 위와 같은 구문을 추가한다. 위 구문은 binary로 slave로 보내기 위한 로그 설정이다. #systemctl restart mariadb my.cnf 설정 변경을 반영하기 위해 mariaDB를 재구동한다. MariaDB [(mysql)] > show master status; 재구동 후 mysql 로 다시 접속하여 master 서버 상태를 확인한다. 아래와 같은 내용이 노출된다면 성공적으로 master가 셋팅된 것이다. slave - 동기화할 DB 및 계정 생성 master 에서 받아온 정보를 동기화 해야 하기 때문에 master에서 생성한 동일한 db와 계정을 slave에도 생성해야 한다. 계정 정보도 master와 동일하게 설정한다. #mysql -u root -p 로 mysql에 접속한다. MariaDB [(none)] > use mysql; Mysql에 접속 되면 위와 같이 mysql DB를 선택한다. MariaDB [(mysql)] > create database testdb default character set utf8; testdb 데이터베이스를 생성한다. MariaDB [(mysql)] > create user testuser@'%' identified by 'password'; testdb 데이터베이스에 접속할 새로운 아이디를 생성한다. slave - slave 설정을 위한 my.cnf 설정 slave 서버 설정을 위해 my.cnf 로 mariaDB 셋팅을 수행한다. #vi /etc/my.cnf vi 로 my.cnf 를 연다. [mysqld] server-id=2 replicate-do-db='testdb' 위와 같이 구문을 추가한다. slave - master 와 replication 연결 master와 replication 연결을 위해 mysql 연결 상태에서 아래와 같이 연동 작업을 한다. 아래 작업은 mysql 접속 상태에서 수행한다. MariaDB [(mysql)] > STOP SLAVE; MariaDB [(mysql)] > RESET SLAVE; 기존 slave 설정이 되어 있었따면 slave 설정을 초기화. MariaDB [(mysql)] > change master to master_host='master 서버 ip', master_user='testuser', master_password='testuser password', master_log_file='mysql-bin.000022', master_log_pos=3858; mysql 명령줄에서 위와 같이 적용한다. 아래 두 줄은 master의 로그파일 참조를 위한 설정이므로 앞서 master 에서 status로 조회한 정보와 동일한 정보를 입력해야 한다. 만약, master에서 db 쿼리 작업이 진행되었다면 log 파일명과 위치가 달려졌을 수 있으므로 위 구문 입력 전 한번 더 master의 갱신된 상태를 조회후 진행하는 것이 좋다. <master 에서 조회한 status> MariaDB [(mysql)] > START SLAVE; slave를 활성화 한다. #systemctl restart mariadb 모든 설정이 완료 되었으므로 mariadb를 재구동하여 설정 내용을 반영한다. master & slave - replication 상태 확인 모든 셋팅이 마무리 되었으므로 replication이 잘 작동중인지 각각의 서버에서 mariaDB 프로세스 상태를 확인해 본다. 아래와 같이 master, slave 모두 replication 상태인 것을 확인할 수 있다. <master> MariaDB [(mysql)] > show processlist\G; (예시이므로 User 명이 다르므로 감안하여 봐야 한다.) <slave> MariaDB [(mysql)] > show processlist\G;
[centOS] MariaDB 5.5 설치 후 기본 설정 (언어셋, MaxConnections 변경)
CentOS 7.5에 MariaDB 5.5 설치 후 기본 환경 셋팅 방법을 안내한다. 세부 설정 내용은 다루지 않고 있으며, MariaDB 서버 언어셋과 MaxConnections 조정 방법만 다룬다. MariaDB 현재 언어셋 확인 MariaDB 최초 설치시 설정되어 있는 언어셋은 'latin'으로 되어있다. 타 MariaDB 로부터 마이그레이션 하게 되는 경우 언어셋이 상이하면 한글이 깨지는 문제가 발생 하므로 기존 DB서버와 동일한 언어셋으로 셋팅해야 한다(UTF-8) 언어셋 설정에 앞서 현재 MariaDB의 설정되어 있는 언어셋을 확인한다. #mysql -u root -p 로 mysql에 접속한다. MariaDB [(none)] > use mysql; Mysql에 접속 되면 위와 같이 mysql DB를 선택한다. MariaDB [mysql]> show variables like 'c%'; 위 명령어로 현재 MariaDB 서버의 기본 언어셋을 확인한다. 출력되는 결과는 아래와 같다. 현재 내 MariaDB는 언어셋이 설정되어 있기 때문에 utf8로 출력되고 있으나, 초기 설정을 하지 않은 상황이라면 latin으로 노출될 것이다. MariaDB 기본 언어셋 변경 현재 MariaDB 언어셋이 utf8이 아니라면 언어셋 변경을 수행한다. mariaDB 설정파일들이 위치한 /etc/my.cnf.d/ 디렉토리 내의 각 설정파일을 열어 개별 수정해도 되지만, /etc/my.cnf 파일에서 언어셋 설정 구문을 추가하여 한번에 설정할 수도 있다. #vi /etc/my.cnf vi 에디터로 my.cnf 설정 파일을 연다. [client] default-character-set = utf8 [mysql] default-character-set = utf8 [mysqldump] default-character-set = utf8 ... [mysqld_safe] my.cnf 내용 중 [mysqld_safe] 를 찾아 바로 위에 위 내용을 추가하고 저장한다. Max Connections (동시 접속자 수) 변경 웹상에서 동시에 MariaDB에 Connection 할 수 있는 동시 접속자 수를 늘리기 위해 아래와 같이 설정한다. Max Connection 수는 서버 사양에 맞게 적절한 수치로 설정한다. #vi /etc/my.cnf vi 에디터로 my.cnf 설정 파일을 연다. [mysqld] ... max_connections = 500 collation-server = utf8_unicode_ci character-set-server = utf8 skip-character-set-client-handshake [mysqld]를 찾아 바로 아래에 내용을 추가한다. 위 내용은 500 Connection 까지 허용시킨 예시다. root 패스워드 변경 MariaDB의 최초 root 계정에는 패스워드가 설정되어 있지 않다. 즉, 외부에서 root 아이디를 패스워드 없이 접속 할 수가 있는 상태이기 때문에 반드시 root 계정에 패스워드를 설정해야 한다. #mysql -u root -p 로 mysql에 접속한다. MariaDB [(none)] > use mysql; Mysql에 접속 되면 위와 같이 mysql DB를 선택한다. MariaDB [(none)] > update user set password=password('원하는 패스워드') where user='root'; 위와 같이 root 에게 패스워드를 부여한다. MariaDB [(none)] > flush privileges; 바로 적용될 수 있도록 flush privileges 로 변경 내용을 업데이트 한다. root 아이디 외부 접속 허용 root 아이디가 외부에서 접속 가능하도록 허용한다. MariaDB [(none)] > grant all privileges on *.* to 'root'@'%' identified by ' root 비밀번호'; 특정 계정에 전역 권한 부여(root권한) root 아이디가 아닌, 다른 아이디에게 root와 동일한 전역권한을 부여하려는 경우 아래 명령어로 가능하다. // localhost에서 접근하는 경우 권한 부여 MariaDB [(none)] > grant all privileges on *.* to 부여받을아이디@'localhost' with grant option; // 외부에서도 권한 부여 MariaDB [(none)] > grant all privileges on *.* to 부여받을아이디@'%' with grant option;
[centOS] 아파치(Apache 2.4.6) 에서 Proxy 추가 보안 설정
Apache 2.4.6 에서 Virtualhost 환경을 구축한 경우 아래와 같이 보안을 위해 구문을 추가해야 한다. 아래 구문이 없다면 서버가 스팸 메일 발송을 위한 relay 서버가 될 수 있어 ip평판이 안좋아질 수 있으니 주의해야 한다. Relay서버가 되는 것을 막기 위한 추가 보안 설정 아래와 같이 몇 줄 만으로 스팸메일 relay 서버가 되는 것을 막을 수 있다. <VirtualHost *:80> ServerName default.only <Location /> Order allow,deny Deny from all </Location> <Proxy *> Order allow,Deny Deny from all </Proxy> ErrorLog /home/server/error_log CustomLog /home/server/access_log common </VirtualHost> 위 구문을 /conf.d/vhosts.conf 등 virtualhost 설정 파일 가장 최상단에 추가하면 된다.
[centOS] 아파치(Apache 2.4.6) 설치 후 기본 환경 설정 (httpd.conf & mpm-worker)
CentOS에서 Yum으로 Apache 2.4.6 설치 후 초기 설정 방법을 안내한다. 아래 안내된 초기 설정은 여러 사이트 운영을 위해 userdir로 여러 Virtualhost를 운영하는 환경하의 설정이다. httpd.conf 설정 과거 httpd.conf 에서 userdir까지 모든 설정이 이뤄진 반면, apache 2.4.6 버전은 httpd.conf 기본 설정 파일과 userdir 설정 파일이 분리되어 있다. 먼저, httpd.conf 기본 설정을 진행한다. #vi /etc/httpd/conf/httpd.conf vi 에디터로 httpd.conf 파일을 연다. NameVirtualHost *:80 앞서 Virtualhost 활성화를 위한 환경임을 언급했다. Virtualhost 활성화를 위해 NameVirtualHost 를 찾아 주석을 해제한 뒤 위와 같이 변경한다. 80번 기본 포트로 들어온 트래픽을 VirtualHost로 유인 시키기 위한 설정이다. ServerAdmin admin@mydomain.com 아파치 구동에 반드시 필요한 설정은 아니지만, 여러 이유로 웹서비스가 정상 구동하지 않는 경우 브라우저상에서 노출될 서버관리자의 이메일 주소를 설정한다. DirectoryIndex index.html index.php Apache에 PHP가 설치된 경우 index.php를 index 페이지로 인식시키기 위해 위와 같이 index.php를 추가한다. AddType application/x-httpd-php .html .htm .php .inc AddType application/x-httpd-php-source .phps 마찬가지로 아파치에서 PHP 구동을 위해 AddType에 위와 같이 추가한다. userdir.conf 설정 Virtualhost 환경 구축을 위해 userdir.conf 파일을 수정한다. #vi /etc/httpd/conf.d/userdir.conf vi 에디터로 conf.d 하위에 있는 userdir.conf 파일을 연다. 참고로. conf.d 하위에 어떠한 이름의 파일을 넣던 확장자가 .conf 인 파일은 데몬에서 자동으로 인클루드 하여 읽게들이게 된다. 즉, 반드시 userdir.conf 일 필요는 없으니 입맛에 맞게 적절히 파일명을 변환하여 사용하여도 된다. UserDir public_html userdir가 바라보는 기본 위치는 /home/ 이다. 다만, UserDir 설정은 /home/유저명/public_html 과 같이 하위 어떤 이름의 디렉토리를 홈디렉토리로 할 것인지 결정한다. <Directory "/home/*/public_html"> AllowOverride FileInfo AuthConfig Limit Options Options SymLinksIfOwnerMatch IncludesNoExec <Limit GET POST OPTIONS> Order allow,deny Allow from all </Limit> <LimitExcept GET POST OPTIONS> Order deny,allow Deny from all </LimitExcept> </Directory> Virtualhost 호스팅 사용자들이 public_html 디렉토리 홈디렉토리 내에서 어느 정도의 권한까지 부여할 것인지 결정한다. 사용자는 .htaccess 나 PHP의 ini_set()등으로 아파치 환경설정 변경의 일부 권한을 행사하게 되는데, 해당 홈경로 내에서만 환경설정 변경을 행사할 수 있으며, 다른 홈디렉토리에는 영향을 주지 않는다. 보안을 고려하여 적절한 권한을 주도록 하자. vhosts.conf 설정 파일 추가 httpd.conf 와 userdir.conf 파일내에는 virtualhost 설정을 위한 구문이 없었기 때문에, conf.d 하위에 vhosts.conf 파일을 추가하여 virtualhost 환경을 구축해야 한다. vi /etc/httpd/conf.d/vhosts.conf vi 에디터로 conf.d 하위에 vhosts.conf 를 새로 만든다. <VirtualHost *:80> ServerName chanyeongpark.com .... </VirtualHost> 새로 만든 vhosts.conf 에 위와 같이 virtualhost 구문을 추가하여 호스팅 셋팅을 할 수 있다. mpm 방식을 worker로 변경 어찌보면 가장 중요한 설정이 아닐까 싶다. 전통적 방식의 prefork방식의 mpm을 worker 방식으로 변경하는 방법이다. prefork는 방문자마다 개별 프로세스를 생성하여 구동되는 방식으로 경우에 따라 프로세스 점유율이 과도하게 높게 나올 수 있지만, worker 방식은 하나의 프로세스를 쓰레드 방식으로 여러 방문자가 나누어 사용하는 방식으로 접속자가 많은 사이트에서는 prefork에 비해 자원을 절약할 수 있다. 상황에 맞게 절절한 mpm을 선택하도록 한다. #vi /etc/httpd/conf.modules.d/00-mpm.conf vi 에디터로 conf.modules.d 하위에 있는 00-mpm.conf 파일을 연다. #LoadModule mpm_worker_module modules/mod_mpm_worker.so LoadModule mpm_worker_module modules/mod_mpm_worker.so 기본으로 활성화된 prefork 라인을 주석처리 하여 prefork를 끈다음, worker.so 라인의 주석을 해제하여 활성화한다. LoadModule mpm_worker_module modules/mod_mpm_worker.so ... <IfModule mpm_worker_module> StartServers 2 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule> worker.so 바로 아래에 <IFModule mpm_worker_module> 구문을 추가하여 worker mpm을 설정한다. 서버 사양에 맞게 적절하게 동시접속자, 쓰레드 크기 등을 결정한다.
[centOS] mariadb(mysql) sql 백업 및 복구 (mysqldump)
서버 마이그레이션을 위해 mariadb 데이터베이스를 sql 파일로 export 하거나 sql 파일을 Mariadb 로 import하는 방법을 안내한다. 데이터베이스를 sql 파일로 dump 하기 ssh 접속 후 쉘 상에서 아래 한줄로 간단하게 데이터베이스를 dump 받아 sql 파일로 백업할 수 있다. #mysqldump -u root -p db명 > 백업할파일명.sql mysqldump 로 sql 백업을 실행한다. Enter password: mysql root 패스워드 입력 dump 를 실행하면 위와 같이 mysql root 입력창이 나오는데, root 패스워드 입력 후 엔터키를 치면 현재 경로에 sql 파일이 생성된다. mysql 접속하여 sql 파일 import 위에서 백업한 sql 파일을 mysql에 접속하여 import 하는 방법을 안내한다. #mysql -u root -p 로 mysql에 접속한다. root패스워드 창에 패스워드 입력 후 엔터키를 치면 mysql 에 접속된다. MariaDB [(none)]> use db명 mysql 접속한 뒤 백업할 db를 선택한다. MariaDB [db_test]> source /home/administrator/db_test.sql 위 명령과 같이 sql 파일이 위치한 경로를 source 경로 와 같이 입력하여 간단하게 import 가능하다.
[centOS] netstat으로 현재 포트별 접속자 수 확인하기
현재 포트별로 접속해있는 동시접속자 수를 확인할 수 있다. 현재 동시접속자 수 확인하기 아래와 같이 동시 접속자 수 확인. awk 명령어를 사용하여 IP 주소를 추출하고, 그룹화하여 각 IP 주소의 중복을 제거한다. #netstat -an | grep ESTABLISHED | grep -E ":443|:80" | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | wc -l netstat command 오류가 발생하는 경우 net-tools 를 설치하여 ifconfig, netstat 이 작동될 수 있도록 한다. #yum install net-tools
[centOS] vsftp 설치 및 설정 방법 (passive mode 설정)
FTP 데몬으로 대표적인 vsftp를 설치하고 passive mode를 설정하는 방법을 안내한다. 아래 설정에서는 - 접속 port : 21000 - data port : 21020 - passive 최소 port : 21021 - passive 최대 port : 21040 을 예로 한다. port 값은 적절히 변경하여 설정한다. vsftp 설치 centos에 vsftp를 설치한다. #yum install vsftpd vsftp 설정 및 passive mode 활성화 vsftp 설치 후 passive mode 활성화를 위한 기본 설정을 수행한다. #vi /etc/vsftpd/vsftpd.conf 아래를 참고하여 해당 옵션을 찾아 주석 혹은 값을 변경한다. anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 #anon_upload_enable=YES #anon_mkdir_write_enable=YES dirmessage_enable=YES xferlog_enable=NO connect_from_port_20=NO #chown_uploads=YES #chown_username=whoever #xferlog_file=/var/log/xferlog xferlog_std_format=NO dual_log_enable=YES #idle_session_timeout=600 #data_connection_timeout=120 #nopriv_user=ftpsecure #async_abor_enable=YES #ascii_upload_enable=YES #ascii_download_enable=YES #ftpd_banner=Welcome to blah FTP service. #banned_email_file=/etc/vsftpd/banned_emails allow_writeable_chroot=YES chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list (chroot_list 파일이 없는 경우 빈 파일을 생성한다.) use_localtime=YES vsftpd_log_file=/var/log/vsftpd.log listen=YES listen_ipv6=NO (목록 탐색 속도가 저하되는 경우 'YES'로 되어 있지 않은지 확인) 위 설정 파일에 없는 passive mode 활성화를 위한 추가 옵션을 아래를 참고하여 conf 파일 가장 끝에 추가한다. pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES listen_port=21000 (원하는 ftp 접속 port 입력) port_enable=YES pasv_enable=YES ftp_data_port=21020 (원하는 ftp data port 입력) pasv_min_port=50021 (원하는 passive 최소 port 입력) pasv_max_port=50040 (원하는 passive 최대 port 입력) pasv_addr_resolve=YES pasv_address=101.250.60.20 or ipa.chanyeongpark.com (서버의 아이피 혹은 도메인 입력. 입력하지 않는 경우 FTP접속시 목록이 보이지 않을 수 있음.) 위 옵션을 추가 완료 하였다면 #systemctl restart vsftpd 로 vsftp를 재시작한다. -- 리눅스 재부팅시에도 자동실행될 수 있도록 서비스 등록 #systemctl enable vsftpd
[centOS] PHP에서 curl시 'cURL error 60: SSL certificate problem' 오류 발생하는 경우
php 에서 curl로 외부 api를 호출하는 경우 인증서 인증 문제로 인해 'Exception cURL error 60: SSL certificate problem' 오류가 발생하는 경우의 해결 방법이다. 나의 경우 api 서버의 let's encrypt 의 root ca 가 최근 변경됨에 따라 인증에 실패하는 경우였는데, api를 호출하려는 클라이언트 서버에서 php.ini 설정을 통해 이를 해결할 수 있다. 최신 cacert.pem 다운로드 root ca 정보가 담긴 최신 cacert.pem을 다운로드 받는다 #cd /etc/ #wget https://curl.haxx.se/ca/cacert.pem 위와 같이 /etc/ 경로로 이동한 후 https://curl.haxx.se/ca/cacert.pem 에서 cacert.pem을 다운로드 받는다. php.ini 설정 다운로드 받은 cacert.pem을 php.ini 설정 파일에서 연결한다. curl.cainfo="/etc/cacert.pem" php.ini 하단에 추가하여 다운로드 받은 cacert.pem 을 연결한다.
[centOS] centos7 환경에서 php7 버전 설치 및 설정 방법
centos7 버전 설치후 yum으로 php설치시 5.* 버전이 설치된다. centos7 환경에서 php7.* 버전 설치 방법과, php.ini 기본 환경 셋팅 방법을 안내한다. epel, remi 리포지토리 설치 centos7 에서 yum설치시 제공하는 리포지토리의 php 기본 버전은 5.* 이기 때문에 별도의 리포지토리 사용을 위한 epel 와 remi 리포지토리를 활성화 한다. #yum install epel-release yum-utils epel을 설치한다. #yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm remi 리포지토리를 설치한다. PHP7.3 설치 앞서 설치했던 remi 리포지토리를 활성화한다. #yum-config-manager --enable remi-php73 일반적으로 많이 사용되는 php 모듈과 함께 설치해 준다. #yum install php php-common php-opcache php-mcrypt php-cli php-gd php-curl php-mysql php-soap php-gd gd-devel php-intl freetype-devel php-mbstring php-pear zlib-devel libjpeg-devel libpng-devel php-oauth php와 각종 모듈 설치가 완료되면 아래와 같이 설치된 php 버전 확인 #php -v # PHP 7.3.1 (cli) (built: Jan 8 2019 13:55:51) ( NTS ) # Copyright (c) 1997-2018 The PHP Group # Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies # with Zend OPcache v7.3.1, Copyright (c) 1999-2018, by Zend Technologies php.ini 설정 php 설치가 완료되었다면 기본적인 php.ini 설정을 수행한다. #vi /etc/php.ini vi로 php.ini를 연다. date.timezone = Asia/Seoul default_socket_timeout = 600 post_max_size = 200M upload_max_files = 200M short_open_tag = On session.gc_probability = 1 session.gc_divisor = 100 oauth 추가한 경우 아래 추가 extension=oauth.so php.ini 에서 해당 옵션을 찾아 주석을 해제하고 변경한다.
[centOS] centos 7 설치 후 필수적인 환경 셋팅
centos 설치 후 데몬 설치 이전에 선행되어야 할 필수적인 환경 셋팅 몇가지를 정리한다. 랜 활성화 centos 설치후 네트워크가 연결이 안되는 경우가 있다. 이 경우 아래와 같이 랜을 활성화할 수 있따. #ip addr 로 랜 이름을 확인. (enp0s3 인 것을 확인.) #ifup enp0s3 랜 활성화 하여 네트워크 연결. ifconfig 활성화 ifconfig 사용을 위해 net-tools 를 설치한다. #yum install net-tools selinux 비활성화 selinux가 필요한 상황이 아니라면 아래와 같은 방법으로 비활성화 한다. #vi /etc/sysconfig/selinux vi로 selinux를 열어 SELINUX=disabled 로 변경한다. #reboot reboot로 os 재부팅 Hostname 변경 os의 hostname을 변경한다 #vi /etc/hostname 으로 설정 파일을 열어 hostname을 입력한다. #reboot reboot로 os 재부팅 DNS 변경 os에서 참조할 DNS서버를 지정한다. #vi /etc/resolv.conf resolv를 vi로 연 다음 nameserver 8.8.8.8 nameserver 8.8.4.4 아래에 구글 DNS 서버를 추가한다. 만약, os 리부트 혹은 network restart 했을때 추가한 nameserver가 초기화 된다면 NM(Network Manager)에 의해 파일 내용이 바뀌는 것이기 때문에 아래와 같이 resolve.conf 파일 수정 후 NM에서 파일을 변경할 수 없도록 변경 즉시 읽기전용 파일로 변환한다. #chattr +i /etc/resolv.conf 읽기전용 파일로 변환한 다음 DNS 적용을 위해 network를 restrart한다. #systemctl restart network os 시간 설정 os의 시간이 현재 시간과 일치하지 않는 경우가 있을 수 있다. 이 경우 아래와 같이 시간을 특정 서버의 시간으로 자동 동기화 하거나, 수동으로 변경할 수 있다. #date 현재 서버 시간 확인 #rdate -s time.bora.net && hwclock -w time.bora.net 의 서버 시간으로 자동 동기화 #date -s "2022-09-09 11:11:11" 수동으로 변경 하는 경우 혹은, 아래와 같이 타임존으로 설정할 수 있다. timedatectl set-timezone Asia/Seoul 보안을 위한 root 접속 막기 보안을 위해 ssh에서 root로 바로 로그인 할 수 없도록 한다. 별도 사용자를 생성 후 해당 아이디로 로그인한 뒤 su 를 통해 root로 전환하여 로그인 할 수 있도록 한다. #vi /etc/ssh/sshd_config ssh 설정 파일을 vi로 열어 PermitRootLogin yes -> PermitRootLogin no 로 변경 #useradd administrator #passwd administrator administrator 사용자를 추가 후 passwd로 패스워드 설정 #vi /etc/pam.d/su su 설정 파일을 vi 로 열어 auth required pam_wheel.so use_uid auth required pam_wheel.so use_uid 라인을 찾아 주석을 해제하고 위와 같이 변경 #vi /etc/group group 설정 파일을 vi로 열어 wheel:x:10:root,administrator wheel 그룹에 administrator 유저를 추가 SSH 접속 포트 변경 보안을 위해 ssh 포트(22)를 다른 포트(20000) 으로 변경한다. #vi /etc/ssh/sshd_config ssh 설정 파일을 vi로 열어 Port 20000 Port를 원하는 포트(20000)로 변경 #systemctl restart sshd sshd 재시작 SSH, FTP 접속 지연 현상 발생시 외부에서 ssh 혹은 ftp 접속시 지연 현상이 발생하는 경우 아래와 같이 설정한다. #vi /etc/ssh/sshd_config ssh 설정 파일을 vi로 열어 X11Forwarding no UseDNS no 두 옵션을 찾아 값을 no 로 설정한다. 만약, ssh 접속시 로그인 단계에서 지연 현상이 발생하는 경우 아래 옵션을 찾아 추가로 변경해준다. GSSAPIAuthentication no network 및 hosts 파일에 hostname 추가 hosts 설정 파일에 호스트명을 추가한다. #vi /etc/hosts vi 로 hosts 를 열어 127.0.0.1 localhost chanyeongpark.com chanyeongpark ::1 localhost chanyeongpark.com chanyeongpark 1.234.27.78(서버아이피주소) chanyeongpark.com chanyeongpark 를 추가한다. #vi /etc/sysconfig/network network를 vi로 연 다음 HOSTNAME=chanyeongpark.com 도메인명을 설정한다. #systemctl restart network network 재시작하여 반영한다.
[centOS] anacron 을 통해 웹소스&DB 백업 및 FTP로 원격 서버에 백업파일 저장
centos에서 웹사이트를 운영중인 경우 anacron을 통해 웹소스 파일과 DB를 백업 및 압축파일로 저장한 뒤 원격 서버로 FTP 접속을 통해 저장한다. (FTP 원격 저장을 위해 ncftp 가 필요하다.) # vi /etc/cron.daily/backup.sh 위와 같이 cron.daily 경로 내에 backup.sh 스크립트 파일을 생성한다. cron.daily 폴더에 파일을 저장하는 경우 cron (anacron)이 매일 정해진 시간에 폴더내 스크립트 파일을 자동실행 하게 된다. W_DATE=`date` #백업날짜 BACKUP_DATE=`date +"%Y%m%d"` #백업파일을 저장할 경로 DIR=/home/_backup /bin/mkdir ${DIR}/${BACKUP_DATE} BACKUP_DIR=${DIR}/${BACKUP_DATE} #MariaDB 백업 /usr/bin/mysqldump -u[ROOT_ID] -p[ROOT_PWSSWORD] [백업할DB명] > ${BACKUP_DIR}/[백업될파일명]_${BACKUP_DATE}.sql #웹소스백업 tar zcvf ${BACKUP_DIR}/[백업될파일명]_${BACKUP_DATE}.tar.gz /home/[백업할사용자] --exclude=/home/[백업할사용자]/WEB-INF #소유주 및 권한변경(타 계정의 접근 차단용) chown -R backup.backup ${BACKUP_DIR} chmod -R 707 ${BACKUP_DIR} # 오래된 백업데이터 삭제(3일 이상 된 것) find "${DIR}/" -mtime +3 -exec rm -rf '{}' \; # 파일의 원격 FTP 백업 ncftpput -R -u [원격지FTP사용자 ID] -p [원격지FTP사용자 PW] -P 21 [원격지FTP 주소] /ServerBackup/ ${BACKUP_DIR}/ exit 0
[centOS] cron(anacron) 을 통해 7일 경과한 시스템 로그 자동 삭제
anacron 을 통해 7일 경과한 시스템 로그를 자동 삭제하는 방법이다. 주기적으로 로그를 삭제해 주지 않으면 하드디스크 공간이 부족하여 웹서비스 작동 불능이 되는 상황을 방지할 수 있다. 로그 관리 방법은 다양하지만, cron을 통해 간단한 방법으로 7일 경과한 로그를 삭제할 수 있다. cron이 /var/log/ 디렉토리내 수정된지 7일 경과한 로그 파일을 하루에 한번씩 검사하여 자동 삭제하게 된다. # vi /etc/cron.daily/logdelete.sh /etc/cron.daily/ 경로에 스크립트 파일을 생성한다. find /var/log/ -mtime +7 -exec rm -f {} \; logdelete.sh 파일에 위와 같이 스크립트를 작성한 뒤 :wq 로 vi 에디터를 저장 후 닫는다. # chmod 707 /etc/cron.daily/logdelete.sh chmod 로 스크립트 파일의 권한을 707로 준다.
[centOS] CentOS 7.8에 무료SSL 인증서 Let's encrypt 발급 및 설치
무료로 제공되는 Let's encrypt 인증서를 Centos 7에 설치하는 방법을 정리한다. Let's encrypt는 리눅스에 Certbot 을 설치 후 발급 받아야 하며, 3개월 뒤 갱신시에도 Cerbot을 통해 재발급 받는다. Centos 에 Certbot 설치 #yum install certbot 로 Cerbot을 설치한다. Certbot 로 인증서 발급 인증서 발급을 하게 되는 경우 현재 커맨드에서 위치한 경로가 홈루드로 잡히게 되므로 아래와 같이 인증서가 연동될 webroot 로 이동한다. (웹사이트의 Virtualhost 경로) #cd /home/testhome/public_html webroot에서 인증서 발급을 시작한다. #certbot certonly --webroot -w . -d mydomain.com 만약, www가 붙은 도메인도 인증서 등록이 필요한 경우 apache를 중지시킨 뒤 아래 명령어로 실행해 준다. #certbot certonly --webroot -w . -d mydomain.com -d www.mydomain.com 위에서 mydomain.com 은 인증서를 등록할 웹사이트의 도메인으로 입력한다. 위 명령어를 수행할 때 경우에 따라 도메인 소유 인증이 되지 않은 경우 .well-known/ 폴더에 특정 파일을 생성해 달라는 안내문구가 나오는 경우가 있는데, 이 경우 #mkdir /home/testhome/public_html/.well-known 폴더 생성, #mkdir /home/testhome/public_html/.well-known/acme-challenge 폴더 생성후 폴더 내부로 이동. #vi 안내된파일명 파일 생성. 위 처럼 폴더 및 파일을 만든 뒤 vi 를 통해 오류문구에서 안내된 내용을 입력 후 저장한 다음 다시한 번 위 인증서 발급 명령을 수행한다. 발급에 성공하면 아래와 같이 안내문구가 나온다. Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator webroot, Installer None Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org Requesting a certificate for testdomain.com Performing the following challenges: http-01 challenge for dooo.us Using the webroot path /home/testhome/public_html for all unmatched domains. Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/testdomain.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/testdomain.com/privkey.pem Your certificate will expire on 2021-09-09. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le 재발급 설정파일에서 webroot 설정 확인하기 앞전에 설명한 대로 실제 웹사이트가 구동되는 경로로 이동하여 인증서를 발급해야 한다고 했지만, 간혹 webroot 설정이 config 파일에서 제대로 설정되지 않아 인증서 갱신시 도메인 인증이 되지 않아 문제가 되는 경우가 있다. 혹시 모르니 아래와 같이 vi 로 설정파일을 열어 webroot가 설정돼 있지 않다면 직접 입력해 준다. #vi /etc/letsencrypt/renewal/mydomain.com.conf 하단부 webroot_map 을 확인한다. [[webroot_map]] mydomain.com = /home/testhome/public_html 아파치 virtualhost 에 인증서 연결 발급된 인증서는 /etc/letsencrypt/live/mydomain.com 경로에 - cert.pem - privkey.pem - chain.pem - fullchain.pem 네개의 파일로 구성돼 있으며, 아래와 같이 virtualhost 에서 연결한다. #vi /etc/httpd/conf.d/vhosts.conf 로 연 다음 아래와 같이 추가 (virtualhost config 파일 경로는 설정에 따라 다르니 유의) <VirtualHost *:443> ServerName mydomain.com DocumentRoot /home/testhome/public_html SSLEngine on SSLCertificateFile /etc/letsencrypt/live/mydomain.com/cert.pem //이 부분 확인 SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.com/privkey.pem //이 부분 확인 SSLCACertificateFile /etc/letsencrypt/live/mydomain.com/chain.pem //이 부분 확인 SSLCertificateChainFile /etc/letsencrypt/live/mydomain.com/fullchain.pem //이 부분 확인 </VirtualHost> 만료일이 도래했다면 Certbot 으로 인증서 갱신 #certbot certificates 인증서의 남은 기간 확인 #certbot renew --dry-run 으로 자동 재발급이 가능한지 확인한다. 도메인 인증이 되지 않았다는 오류가 뜬다면 위에서 설명한 대로 webroot를 확인 필요. 정상적으로 작동 한다면 #certbot renew 로 인증서 갱신! 매월1일 자동 갱신하도록 crontab 스케줄 등록 매월 1일 만료일 도래한 인증서를 자동으로 갱신할 수 있도록 crontab 스케줄로 등록한다. #crontab -l 로 현재 등록된 스케줄 확인 #crontab -e 로 스케줄 등록 시도. (vi 에디터로 스케줄 입력 화면이 열린다.) 0 3 1 * * /usr/bin/certbot renew --renew-hook="systemctl restart httpd" 입력 후 :wq로 저장하여 나온다. 위 스케줄은 매월 1일 오전 3시에 실행하며, renew 완료 후 아파치를 재시작한다.
[PHP¢OS] PHP exec() 함수로 아파치 restart 하기
PHP를 통해 Linux(CentOS)의 apache 데몬을 graceful 혹은 restart 해야 하는 상황이 생겼다. 기본적으로 별도의 리눅스 sudo 설정을 하지 않았다면, PHP의 exec() 이나 shell_exec() 함수를 통한 리눅스 명령어 엑세스는 디렉터리를 조회하는 등의 일반 user 에게 부여되는 엑세스만 가능하다. apache 등의 데몬을 제어하기 위해선 sudo 설정을 통해 일부 명령어에 root 권한을 부여해야 한다. visudo 설정하여 외부 exec() 권한 부여 (CentOS 7.*를 기준으로 한다.) #visudo 로 sudo 설정파일을 연다. ( #vi sudoers 로 열게 되면 readonly 모드로 열리므로 #visudo 로 열어 수정해야 한다. ) apache ALL=NOPASSWD:/sbin/service 를 추가한다. 가장 앞에 위치한 'apache'의 경우 리눅스 셋팅에 따라 www-data 혹은 nobody 가 되기도 하므로 주의! PHP에서 exec() 으로 apache restart 하기 visudo를 수정 하였기 때문에 /sbin/service 에 apache 에게 root 권한이 부여 되어 웹에서 PHP를 통해 service 제어가 가능해졌다. 아래와 같이 test.php 파일 하나를 만들고 테스트 코드를 작성해 보자. exec("/usr/bin/sudo /sbin/service httpd restart > /dev/null 2>&1 &"); http://domain/test.php 로 접속하게 되면 정상적으로 아파치가 재시작 된 것을 확인해 볼 수 있다. ( > /dev/null 2>&1 & 은 php에서 응답을 기다리지 않고, 백그라운드에서 실행되도록 하는 옵션이다.)
1
2