NGINX + PHP 7.3 + MARIADB

스마트폰에서 운영하는 웹서버와 데이터베이스

Nginx, PHP 7.3, PHP-FPM, MariaDB를 함께 구성하면 스마트폰에서도 웹사이트와 데이터베이스를 운영할 수 있습니다. 공유기와 도메인을 연결하면 소규모 서비스로 충분히 활용할 수 있습니다.

1. 기본 설치

Termux에서는 다음 명령으로 Nginx, PHP, PHP-FPM, MariaDB를 설치합니다. Termux 저장소의 PHP 버전은 시점에 따라 달라질 수 있으므로 PHP 7.3이 꼭 필요한 경우 설치 후 php -v로 버전을 확인하고 호환되는 패키지 저장소나 별도 빌드를 검토해야 합니다.

pkg update && pkg upgrade
      pkg install nginx php php-fpm mariadb
      php -v
mkdir -p $HOME/www

MyBoard 파일을 $HOME/www/myboard에 배치하고 data 폴더에 쓰기 권한을 준비합니다. 글쓰기 첨부파일과 에디터 이미지는 날짜와 난수 코드가 포함된 파일명으로 이 폴더에 저장됩니다.

cd $HOME/www/myboard
mkdir -p data uploads
php install.php

2. MariaDB 설치와 초기화

MariaDB는 MyBoard 또는 다른 PHP 애플리케이션에서 사용할 수 있는 관계형 데이터베이스입니다. 처음 한 번 데이터 디렉터리를 초기화한 뒤 서버를 시작합니다.

mkdir -p $PREFIX/var/lib/mysql
# Termux 버전에 따라 둘 중 하나를 사용합니다.
mariadb-install-db || mysql_install_db
mysqld_safe -u root &

서버가 실행되면 별도 터미널에서 root로 접속해 데이터베이스와 애플리케이션 계정을 만듭니다.

mysql -u root
CREATE DATABASE myboard CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myboard_user'@'localhost' IDENTIFIED BY '비밀번호를_직접_변경하세요';
GRANT ALL PRIVILEGES ON myboard.* TO 'myboard_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

실제 비밀번호는 예시 값을 사용하지 말고 충분히 긴 값으로 변경하세요. 현재 MyBoard는 기본 SQLite로도 동작하므로 MariaDB를 사용하려면 애플리케이션 DB 설정과 스키마를 별도로 전환해야 합니다.

3. Nginx와 PHP 7.3 연결

이 구성에서는 스마트폰 내부의 MyBoard 서비스를 8080 포트에서 실행하고, Nginx는 외부 요청을 받아 HTTPS를 처리하는 앞단 리버스 프록시로 사용합니다. Nginx가 PHP를 직접 실행하는 것이 아니라 내부 8080 서비스로 요청을 전달하는 구조입니다.

php-fpm
nginx

스마트폰 환경에서는 권한과 운영 특성상 웹 애플리케이션을 8080 같은 높은 포트에서 실행합니다. 먼저 브라우저에서 http://127.0.0.1:8080/ 또는 스마트폰 내부 IP의 8080 포트로 접속해 MyBoard가 정상적으로 열리는지 확인합니다.

PHP를 Nginx에서 직접 처리하는 구성이라면 PHP 7.3과 PHP-FPM의 버전을 먼저 확인해야 합니다. php CLI 버전과 php-fpm 버전이 서로 다를 수 있으므로 둘 다 확인하고, PHP 7.3이 아니면 설정 파일의 소켓 또는 포트가 현재 설치된 PHP-FPM과 맞지 않을 수 있습니다.

php -v
    php-fpm -v
    command -v php
    command -v php-fpm

확인한 PHP-FPM이 127.0.0.1의 9000번 포트에서 실행 중인 경우 Nginx 설정은 다음처럼 작성할 수 있습니다. Unix 소켓을 사용하는 환경이라면 fastcgi_pass의 경로를 실제 PHP-FPM 설정의 listen 값으로 바꿔야 합니다.

server {
      listen 8080;
      server_name _;
      root /data/data/com.termux/files/home/www/myboard;
      index index.php index.html;

      location / {
        try_files $uri $uri/ /index.php?$query_string;
      }

      location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
      }
    }

PHP 7.3 전용 환경이라면 PHP-FPM도 반드시 7.3 계열인지 확인한 뒤 설정을 적용하세요. Nginx 설정을 저장한 후에는 nginx -t로 문법과 참조 경로를 검사하고, PHP-FPM과 Nginx를 다시 시작해야 변경 내용이 반영됩니다.

4. 도메인 설정

  1. 도메인 등록 업체에서 도메인을 준비합니다.
  2. 대표 도메인(1차 도메인)의 A 레코드를 서버가 연결된 공인 IP 주소로 지정합니다.
  3. DNS-01 방식으로 인증서를 발급할 때는 대표 도메인에 인증기관이 안내한 TXT 값을 추가합니다.
  4. 대표 도메인에 연결할 2차 도메인이나 하위 도메인은 각각 A 레코드만 서버 IP로 지정합니다.
  5. 공인 IP가 바뀌는 인터넷이라면 DDNS를 사용해 도메인이 항상 현재 주소를 가리키도록 합니다.
  6. Nginx의 server 설정에서 도메인과 MyBoard 문서 경로를 지정합니다.

예를 들어 대표 도메인이 example.com이면 다음처럼 설정합니다. TXT의 값은 Certbot이나 ACME 클라이언트가 발급할 때 표시한 값을 그대로 입력해야 하며, 임의의 문자열을 넣으면 도메인 소유권 확인에 실패합니다.

example.com        A     공인_IP_주소
_acme-challenge   TXT   인증서_발급_도구가_안내한_TXT_값

www.example.com   A     공인_IP_주소
app.example.com   A     공인_IP_주소

정리하면 1차 도메인은 서버 연결을 위한 A 레코드와 DNS-01 인증이 필요한 경우의 TXT 레코드를 확인하고, 2차 도메인부터는 A 레코드를 추가한 뒤 Nginx의 server_name에도 이름을 등록합니다. 인증서를 새로 발급하거나 갱신할 때는 인증서 범위와 발급 방식에 따라 TXT 확인이 다시 필요할 수 있습니다.

server {
      listen 443 ssl;
      server_name example.com www.example.com;

      ssl_certificate /data/data/com.termux/files/home/.ssl/example.com/fullchain.pem;
      ssl_certificate_key /data/data/com.termux/files/home/.ssl/example.com/privkey.pem;

      location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
      }
    }

위 설정의 핵심은 외부 도메인의 HTTPS 요청을 Nginx가 443번에서 받은 다음, 스마트폰 내부의 127.0.0.1:8080으로 전달하는 것입니다. 즉 사용자는 https://example.com으로 접속하고, Nginx 뒤의 MyBoard는 스마트폰 내부 8080 포트에서 동작합니다.

Android 스마트폰의 Termux에서는 80번 웹 포트를 사용할 수 없으므로 이 안내는 80번 리다이렉트 서버 없이 443번 HTTPS를 직접 사용하는 구성입니다. DNS만 연결해서는 동작하지 않으며, Nginx의 443 리버스 프록시 설정과 내부 8080 서비스가 모두 실행되어야 합니다.

5. 공유기와 외부 연결

스마트폰을 공유기 옆에 두고 전원과 네트워크를 안정적으로 연결하면 서버로 운영하기 좋습니다. 스마트폰 서버는 공유기와 충분히 연결 가능하며, 같은 네트워크에서는 내부 IP로 바로 접속할 수 있습니다.

외부에서 접속하려면 공유기에서 외부 443번 포트를 스마트폰 내부 IP의 443번 포트로 포트포워딩합니다. 80번 포트는 스마트폰에서 사용할 수 없으므로 포워딩 대상에서 제외합니다.

  • 외부 443번 포트 → 스마트폰 내부 IP의 Nginx 443번 포트
  • Nginx가 HTTPS를 종료하고 내부 127.0.0.1:8080의 MyBoard로 전달
  • 스마트폰의 내부 IP가 바뀌지 않도록 DHCP 예약 설정

통신사의 CGNAT이나 공유기 정책으로 443번 포트도 외부에서 들어오지 못할 수 있습니다. 이때는 DDNS, 터널링 또는 외부 VPS를 함께 검토해야 합니다.

6. 운영 명령과 HTTPS 주의사항

운영 중에는 각 서비스를 순서대로 시작하고 상태를 확인합니다.

mysqld_safe -u root &
      php-fpm
      nginx

      ps aux | grep -E 'mysqld|php-fpm|nginx'
      nginx -t
      tail -f $PREFIX/var/log/nginx/error.log

서비스를 종료하거나 데이터를 백업할 때는 다음 명령을 사용할 수 있습니다.

nginx -s quit
      pkill php-fpm
      mysqladmin -u root shutdown
      mysqldump -u root myboard > $HOME/myboard_$(date +%Y%m%d).sql

443번 포트에서 사용할 인증서는 Android 스마트폰의 Termux에서 별도로 발급받아야 합니다. ACME 클라이언트나 Certbot 계열 도구로 도메인 소유권을 확인한 뒤 인증서와 개인키를 Termux의 안전한 경로에 저장하고, Nginx의 ssl_certificate와 ssl_certificate_key에 그 경로를 지정해야 합니다.

스마트폰에서는 80번 포트를 사용할 수 없으므로 HTTP-01 방식의 인증이 어려울 수 있습니다. 이 경우 DNS에 TXT 레코드를 추가해 확인하는 DNS-01 방식과 인증서 자동 갱신 방법을 별도로 검토해야 합니다. 인증서를 받은 뒤에는 443 포트 포워딩과 Nginx SSL 설정까지 맞아야 합니다.

도메인과 443 인증 설정은 처음 접하면 쉬운 작업이 아닙니다. DNS, 포트포워딩, Android Termux 인증서 발급, Nginx 설정을 순서대로 학습하면서 진행하고, 오류가 발생하면 AI를 통해 설정 내용을 확인하고 도움을 받는 것이 좋습니다. 사용 중인 통신사와 공유기, Termux 환경을 함께 알려주면 더 정확하게 안내받을 수 있습니다.

관리자 비밀번호를 변경하고, 필요한 포트만 열며, Nginx와 PHP를 최신 상태로 유지하세요.

정리하면, 스마트폰을 공유기 옆에 두고 Nginx와 PHP-FPM을 실행하면 가정이나 소규모 환경에서도 MyBoard를 충분히 연결해 사용할 수 있습니다.

7. Nginx 설정 파일 저장 위치 확인

Nginx 설정 파일을 저장하는 폴더는 설치 환경에 따라 보통 다음 세 곳 중 하나입니다. 같은 이름의 설정을 여러 곳에 만들기보다, 현재 Nginx가 실제로 읽는 경로를 먼저 확인한 뒤 그 위치에 저장해야 합니다.

# Termux
$PREFIX/etc/nginx/nginx.conf

# Ubuntu, Debian 계열
/etc/nginx/sites-available/default
/etc/nginx/sites-enabled/default

# CentOS, Fedora 또는 일부 패키지 구성
/etc/nginx/conf.d/default.conf

Termux는 Android 앱 전용 영역 아래의 $PREFIX/etc/nginx를 사용하고, Debian·Ubuntu는 여러 사이트를 관리하기 위해 sites-available에 원본을 저장한 뒤 sites-enabled에 활성화된 설정을 연결하는 방식을 주로 사용합니다. CentOS·Fedora 계열이나 일부 직접 설치본은 conf.d 안의 *.conf 파일을 자동으로 읽습니다.

저장 위치가 다른 이유는 운영체제의 패키지 관리자, Nginx 패키지의 기본 include 설정, 여러 사이트를 관리하는 방식이 서로 다르기 때문입니다. 현재 적용되는 폴더는 다음 명령으로 확인할 수 있습니다.

nginx -T 2>/dev/null | head -n 30
nginx -t

nginx -T 출력에 표시되는 include 경로와 실제로 읽힌 파일을 기준으로 설정을 저장하세요. 파일을 올바른 폴더에 두었더라도 nginx -t에서 오류가 나면 PHP-FPM의 listen 값, 문서 루트, 파일 권한을 함께 확인해야 합니다.