FEMP는 (F)reeBSD, (E)Nginx, (M)ariaDB, (P)HP 의 약자로서, FreeBSD 기반의 웹 서버 플랫폼을 말합니다.
본 포스팅에서는 FreeBSD 에 Nginx, MariaDB, PHP 를 설치하고 이들을 연결하는 것을 해 볼 것입니다.
Nginx 와 PHP 는 FEP 감옥에 설치할 것이고
MariaDB 는 MariaDB 감옥에 설치할 것입니다.
이렇게 DB 를 분리하는 이유는 패키지 충돌을 막기 위해서입니다.
많은 수의 DB가 필요한 패키지 에서 MySQL을 사용하려 합니다. 그런데 MySQL 은 무거워요. 그래서 MySQL보다 가벼운 MariaDB를 설치할 경우 서버의 부하가 좀 줄어들죠. 그런데 MariaDB 가 설치된 상태로, MySQL을 사용하려고 하는 패키지를 설치할 경우 MariaDB 서버와 클라이언트가 지워지고 MySQL 클라이언트만 남는 괴상한 상황이 발생할 수 있습니다.
이걸 해결하는 가장 간단하면서도 보기 좋은 방법은 아예 jail을 분리하는 것입니다. 프로그램 입장에서는 DB 서버가 따로 만들어져있는 셈이죠.
Dataset 만들기
Temp/temp/php_file_upload
파일 업로드 시 임시 파일이 저장될 위치입니다.
System/Logs/FEP
로그가 저장될 데이터셋입니다.
Nginx+PHP
FEP Jail 부터 먼저 만들겠습니다.
Jail 만들기
Jail의 이름은 FEP
자동 시작 설정 해 주세요.
마운트 포인트 설정
iocage exec FEP mkdir -p /mnt/temp /var/log/nginx/
임시 파일이 저장될 디렉토리와 nginx 의 로그가 저장될 디렉토리를 만들어 준 후
iocage stop FEP
감옥을 정지시켜주고
/mnt/Temp/temp/php_file_upload ↔ /mnt/temp
/mnt/System/Logs/FEP ↔ /var/log/nginx/
마운트 해 주세요.
패키지 설치
iocage console FEP
감옥에 로그인 해 주세요.
‘pkg 와 port – 레포 바꾸기‘ 를 참고하여 레포를 최신으로 바꿔 주세요.
pkg install php72 nginx php72-mysqli
현재 포스팅 하는 시점 기준으로 php 7.3 이 나오긴 하였습니다만, 아직까지 7.2까지만 지원하는 프로그램이 많아서 7.2를 설치하였습니다.
가장 기본적인 패키지만 설치하였습니다.
Nginx 와 PHP 연동
Nginx 는 php를 해석하지 못합니다. 그래서 php-fpm 이라는 프로그램이 php를 대신 해석합니다. 즉, Nginx 에서 php 요청이 들어오면 php-fpm 에 요청을 전달하고, php-fpm 이 해석한 php 페이지를 nginx 가 제공하는 형태입니다.
Nginx 설정
cd /usr/local/etc/nginx/
nginx 의 설정 디렉토리로 이동하고
mkdir options otherconf conf.d
설정 디렉토리를 만들어 준 후
rm nginx.conf
기본 설정 파일을 삭제하고
vi nginx.conf
새로운 설정 파일을 작성합니다.
user www; worker_processes auto; events { use kqueue; worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_not_found off; error_log /var/log/nginx/error.log; sendfile on; tcp_nopush on; keepalive_timeout 65; set_real_ip_from Nginx_WAF의IP; real_ip_header X-Forwarded-For; #virtual hosts# include conf.d/*.conf; }
vi otherconf/php.conf
PHP와 연동하기 위한 설정을 작성합니다.
location ~ \.php(?:$|/) { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_pass unix:/var/run/php72-fpm.sock; fastcgi_intercept_errors on; fastcgi_index index.php; }
모두 입력하였다면 nginx -t
를 입력해 구문을 테스트합니다. 아무 문제가 없다면 아래와 같은 메세지가 나타나야 합니다.
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
PHP 설정
삭제된 부분 :
disable_functions =exec,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
php.ini 프로덕션 파일을 php.ini 파일로 복사하였습니다.
vi /usr/local/etc/php.ini
php.ini 파일을 수정합니다. 아래와 같이 해당되는 설정을 찾아 수정해 주세요.
expose_php = off upload_tmp_dir = "/mnt/temp" error_log="/var/log/nginx/php/error.log" max_execution_time = 14400 max_input_time = 14400 memory_limit = 512M date.timezone = Asia/Seoul post_max_size = 200M upload_max_filesize = 128M cgi.fix_pathinfo=0 allow_url_fopen = off
vi /usr/local/etc/php-fpm.d/www.conf
www.conf 설정도 수정해 줍니다. 아래와 같이 해당되는 부분을 찾아 수정해 주세요.
user = www group = www listen = /var/run/php72-fpm.sock listen.owner = www listen.group = www
위와 같이 해당되는 부분을 찾아 수정해 주세요.
mkdir -p /var/log/nginx/php
php 의 에러가 저장될 디렉토리를 만들었습니다.
PHP 작동 테스트
php 가 제대로 작동하는지 테스트를 위해 php 정보 페이지를 만들어보겠습니다.
mkdir -p /usr/local/www/php_test
디렉토리를 만들고
vi /usr/local/www/php_test/index.php
index.php 파일을 작성합니다.
<?php phpinfo(); ?>
vi /usr/local/etc/nginx/conf.d/test.conf
테스트를 위한 서버 블록도 만들어 줍니다.
server { listen 80 default_server; root /usr/local/www/php_test; index index.php; include otherconf/php.conf; }
올바르게 작성했다면 php 와 nginx 를 한번 시작해 줍니다.
service php-fpm onestart && service nginx onestart
http://FEP감옥IP/index.php
이때 아래와 같은 페이지가 나타나면 제대로 된 것입니다.
정상적으로 작동한다면 테스트를 끝내겠습니다.
rm -r /usr/local/etc/nginx/conf.d/test.conf /usr/local/www/php_test
test 서버 블럭과 /usr/local/www/php_test 를 삭제합니다.
서비스 시작
sysrc php_fpm_enable="YES"
sysrc nginx_enable="YES"
서비스에 등록해주고
service php-fpm restart && service nginx restart
재시작 해 줍니다.
MariaDB
MariaDB는 Mysql의 포크로서 Mysql 보다 라이센스가 더 자유롭고 Mysql보다 더 가볍습니다. 사실 라이센스야 개인 서버 수준에서는 그다지 신경쓰지 않아도 되긴 합니다만, 가벼운건 확실히 장점이죠.
Jail 만들기
Jail의 이름은 MariaDB
자동 시작 설정 해 주세요.
패키지 설치
iocage console MariaDB
감옥으로 로그인 해 준 다음
‘pkg 와 port – 레포 바꾸기‘ 를 참고하여 레포를 최신으로 바꿔 주세요.
pkg install mariadb103-server mariadb103-client
MariaDB 10.3 버전을 설치하였습니다.
MariaDB 설정
service mysql-server onestart
초기 실행을 해 주고
mysql_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 you haven't set the root password yet, the password will be blank, so you should just press enter here. #루트 비밀번호가 설정되어 있지 않은 상태이니 아무것도 입력하지 않고 엔터 치면 됩니다. Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation. #MariaDB 의 root 비밀번호를 설정하는 것입니다. 충분히 복잡하게 해 주세요. Set root password? [Y/n] y New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success! 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! 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] y ... Success! 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! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] y ... Success! Cleaning up... All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB!
위는 출력 예시입니다.
vi /var/db/mysql/my.cnf
MariaDB 설정 파일을 작성합니다.
[mysqld] innodb_file_per_table = 1 init_connect="SET collation_connection = utf8mb4_general_ci" init_connect="SET NAMES utf8mb4" character-set-server = utf8mb4 collation-server = utf8mb4_general_ci [client] default-character-set = utf8mb4 [mysqldump] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4
MariaDB 콘솔 접속
mysql -u root -p
앞서 설정한 비밀번호를 입력해 로그인 할 수 있습니다.
서비스 시작
sysrc mysql_enable="YES"
자동 시작되게 해 주고
service mysql restart
mariadb 를 재시작 해 줍니다.
마치면서
FEMP 설정이 완료되었습니다.
다음 포스팅은 FEMP를 기반으로 몇 가지 웹 서비스를 설치하고 구동해 보겠습니다.