웹 서버 – FEMP

FEMP(F)reeBSD, (E)Nginx, (M)ariaDB, (P)HP 의 약자로서, FreeBSD 기반의 웹 서버 플랫폼을 말합니다.

본 포스팅에서는 FreeBSD 에 Nginx, MariaDB, PHP 를 설치하고 이들을 연결하는 것을 해 볼 것입니다.

NginxPHPFEP 감옥에 설치할 것이고

MariaDBMariaDB 감옥에 설치할 것입니다.

이렇게 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 설정

20191208 수정
disable_functions 부분을 제거하였습니다. TTRSS 나 NextCloud 등에서 몇 가지 문제가 생기는 것을 확인하였습니다. WordPress와 MediaWiki 에서는 문제가 생기지 않습니다.

삭제된 부분 :

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 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를 기반으로 몇 가지 웹 서비스를 설치하고 구동해 보겠습니다.

시리즈 네비게이션<< SFTP 공유개인 위키 – MediaWiki >>

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다