본문 바로가기

웹서버

라즈베리파이에 Nginx와 워드프레스 설정을 하자

*본 글은 ChatGPT를 활용해 작성하였습니다.

*라즈베리파이(Raspberry Pi)는 신용카드 크기의 초소형 단일 보드 컴퓨터로, 작은 크기와 낮은 전력 소모에도 불구하고 일반 PC와 유사한 기능을 수행할 수 있는 장치이다. 가격이 저렴하여 부담 없이 사용할 수 있으며, 리눅스 기반 운영체제를 지원해 프로그래밍 학습, 서버 구축, IoT 개발, 홈서버, 원격 데스크톱 환경 구성 등 다양한 용도로 활용된다. 여기서는 라즈베리파이를 웹서버 용도로 사용하는 방법에 대해 알아보자.

<준비물>

■ 라즈베리파이 본체 : 라즈베리파이 4B 4GB 와 쿨러 케이스

■ microSD 카드 : Sandisk Ultra 32GB

■ microSD 카드 리더기 : microSD를 PC의 USB에 연결할 목적으로 사용된다.

■ 전원 케이블 : C 타입 5V 3A 어댑터 (라즈베리파이 4B는 전력을 많이 소비하므로 5V 3A 이상 전력이 필요하다.)

<설치 과정>

(1) MicroSD 카드 리더기에서 MicroSD 카드를 넣고, PC의 USB에 연결한다.

(2) MIcroSD에 우분투 서버 버전을 설치하기 위해 PC에 Raspberry Pi Imager를 다운로드하여 설치한다.

위치 : https://www.raspberrypi.com/software/

(3) 라즈베리 파이 이미저를 실행하고 다음 과정으로 설치한다.

1) 라즈베리 파이 장치를 선택하세요 : 자신의 라즈베리 파이 장치를 선택한다.

2) 운영 체제 선택 : Other general-purpose OS > Ubuntu > Ubuntu Server 24.04.4 LTS (64-bit)

*우분투 서버 버전을 설치하여야 ssh가 자동으로 설치된다.

3) 저장소를 선택하세요 : 자신의 MicroSD 저장장치를 선택한다.

4) 사용자 지정 호스트 이름 선택 : ubuntu (임시로 지정)

5) 사용자 지정: 지역화 (다음과 같이 지정)

6) 사용자 지정: 사용자 이름 선택 : 자신의 계정을 만든다. ssh에 접속할 때 사용된다.

7) 사용자 지정 : Wi-Fi 선택 : 와이파이의 SSID와 비밀번호를 입력한다.

8) 사용자 지정 : SSH 인증 : 'SSH 사용'을 활성화한 후, 인증 방식을 '비밀번호 인증 사용' 옵션을 선택한다.

(4) '사용자 지정'을 완료했으므로 이미지를 저장 장치에 기록한다.

(5) 이미지가 저장된 microSD 카드를 라즈베리파이 장치에 연결한 다음 전원을 연결한 후 1~2분 기다린다. 그리고 웹브라우저에 192.168.0.1을 입력해 ipTIME 공유기에 로그인한 다음 'DHCP 서버 설정'에서 라즈베리파이의 무선랜 주소를 확인한다. 여기서는 호스트 이름이 ubuntu인 경우 192.168.0.32 임을 확인할 수 있다.

(6) PC에서 사용자 이름과 비밀번호를 입력해서 라즈베리파이의 ssh에 접속한다.

ssh <사용자 이름>@192.168.0.32

(7) 접속이 잘 되었으면 라즈베리파이의 서버를 최신 버전으로 업그레이드한다.

sudo apt update
sudo apt upgrade

(8) 가벼운 DE인 xfce4와 관련 유틸을 설치하고, 원격 접속을 위해 tigervnc를 설치한다.

sudo apt install xfce4 xfce4-goodies tigervnc-standalone-server tigervnc-common

(9) tigvervnc의 설정을 위해 xstartup 파일을 열고 수정한 후 권한 설정을 한다.

mkdir ~/.vnc
nano ~/.vnc/xstartup
chmod +x ~/.vnc/xstartup

(10) xstartup 파일에 다음과 같이 입력한 후 저장한다.

# 세션 초기화
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
# 기본 설정 로드
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
# VNC 설정 도구 실행 (백그라운드)
vncconfig -iconic &
# XFCE4 실행 (가장 중요: 마지막 명령어는 & 없이 실행)
# 이렇게 해야 이 프로세스가 유지되는 동안 VNC 세션이 유지된다.
exec startxfce4

(11) 터미널에서 다음과 같이 입력해서 vncserver를 실행한 후, vnc 접속시 비밀번호를 설정한다. view-only password는 설정하지 않아도 되므로 n 을 입력한다. 비밀번호는 처음 한 번만 설정하면 된다.

* -localhost no 옵션은 외부 PC에서 직접 접속이 가능하게 한다.

vncserver -localhost no :1

(12) 쿠분투 PC에서 Discover를 열고 TigerVNC 뷰어를 설치한다. TigerVNC 전용 뷰어를 사용하면 창이 크기에 따라 해상도가 저절로 변경된다. 윈도우 환경에서는 UltraVNC Viewer를 사용하면 된다.

(13) VNC 서버 주소와 포트 번호로 5901을 입력하고, 생성한 비밀번호를 입력하면 라즈베리파이로 원격 데스크톱 연결이 시작된다.

(14) 라즈베리파이의 xfce4 데스크톱에 연결한 화면은 다음과 같다.

(15) 한글 입력기 설정을 위해 ibus-hangul과 나눔, 백묵, 은 폰트를 설치한다.

sudo apt install ibus-hangul *nanum* *baekmuk* *unfonts*

(16) Application > Settings > IBus Preferences 메뉴를 클릭하여 'Input Method' 탭에서 Korean - Hangul 을 추가한다. 상단 패널에 있는 'KO' 아이콘을 마우스로 클릭해서 태극 마크가 보이게 하면 제대로 설치가 된 것이다.

(17) 속도가 빠른 brave 웹브라우저를 설치한 후, 리부팅한다.

sudo curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg
sudo curl -fsSLo /etc/apt/sources.list.d/brave-browser-release.sources https://brave-browser-apt-release.s3.brave.com/brave-browser.sources
sudo apt update
sudo apt install brave-browser
brave-browser

(18) xfce4 자체 터미널은 기능이 많지 않으므로 konsole을 설치한다

sudo apt install konsole

(19) 외부 IP를 내부 IP를 가진 장치와 연결하려면 포트포워딩이 필요하다. 웹브라우저를 열고 192.168.0.1 을 입력해서 ipTIME 관리자 페이지를 연다. 'NAT/라우터 관리 > 포트포워드 설정'으로 이동한다.

(20) 웹서버를 설정해야 하므로, '규칙 이름'을 임의로 'HTTPS'라고 입력한 후, '규칙 종류'를 'HTTPS'로 설정한다. '외부/내부 포트'는 자동으로 지정된 값을 사용한다. 내부 IP 주소는 라즈베리파이의 IP 주소인 192.168.0.32를 사용한다.

*마찬가지 방식으로 HTTP 설정도 함께 해야 한다.

(21) 다음 문서를 참고하여 무료 도메인을 등록한다.

참고 : https://blog.naver.com/swkoo981/224007356185

(22) HTTPS로 보안 연결을 하기 위해 등록된 도메인으로 Certbot을 이용한 무료 SSL 인증서인 Let's Encrypt 인증서를 발급한다. snap으로 설치하면 추가 설정 없이 인증서를 자동으로 갱신할 수 있다. 아래 명령어에서 등록된 무료 도메인으로 'example.com'을 수정한다. (인증서의 유효기간은 90일이다.)

sudo snap install --classic certbot
sudo certbot certonly --standalone -d example.com

*실행 후 인증서와 보안 키가 저장된 위치를 기억한다.

(23) snap certbot은 기본 위치가 다르므로 심볼릭 링크를 만든다.

sudo ln -s /snap/bin/certbot /usr/bin/certbot

(24) 설치 스크립트를 setup.sh 로 저장하거나 첨부된 파일을 활용한다. DOMAIN과 EMAIL을 설정해야 한다.

#!/bin/bash
set -e
# =====================
# 사용자 설정
# =====================
DOMAIN="example.com" #도메인 앞부분의 www를 빼야 한다.
EMAIL="your-email@example.com"
DB_NAME="wordpress"
DB_USER="wpuser"
DB_PASS="wppassword"
WEBROOT="/var/www/$DOMAIN"
echo "📦 패키지 설치..."
sudo apt update
sudo apt install -y nginx mariadb-server php-fpm php-mysql php-cli php-curl php-gd php-mbstring php-xml php-zip unzip curl certbot
echo "🛢️ MariaDB 시작..."
sudo systemctl enable mariadb
sudo systemctl start mariadb
echo "🛢️ DB 생성..."
sudo mysql -u root <<EOF
CREATE DATABASE IF NOT EXISTS $DB_NAME;
CREATE USER IF NOT EXISTS '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';
GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'localhost';
FLUSH PRIVILEGES;
EOF
echo "📁 웹 루트 준비..."
sudo mkdir -p $WEBROOT
sudo chown -R $USER:$USER $WEBROOT
echo "📥 WordPress 다운로드..."
cd /tmp
unzip -o latest.zip
sudo rm -rf $WEBROOT/*
sudo cp -r wordpress/* $WEBROOT/
echo "🔐 권한 설정..."
sudo chown -R www-data:www-data $WEBROOT
sudo find $WEBROOT -type d -exec chmod 755 {} \;
sudo find $WEBROOT -type f -exec chmod 644 {} \;
echo "⚙️ wp-config 생성..."
sudo cp $WEBROOT/wp-config-sample.php $WEBROOT/wp-config.php
sudo sed -i "s/database_name_here/$DB_NAME/" $WEBROOT/wp-config.php
sudo sed -i "s/username_here/$DB_USER/" $WEBROOT/wp-config.php
sudo sed -i "s/password_here/$DB_PASS/" $WEBROOT/wp-config.php
echo "🔐 WordPress 보안 키 설정..."
echo "🔍 PHP-FPM 소켓 탐지..."
PHP_SOCK=$(ls /run/php/php*-fpm.sock | head -n 1)
echo "👉 PHP 소켓: $PHP_SOCK"
# =====================
# 1️⃣ HTTP 설정 먼저 (nginx 안전 실행)
# =====================
echo "⚙️ Nginx HTTP 설정 생성..."
sudo bash -c "cat > /etc/nginx/sites-available/$DOMAIN" <<EOF
server {
listen 80;
server_name $DOMAIN www.$DOMAIN;
root $WEBROOT;
index index.php index.html;
location / {
try_files \$uri \$uri/ /index.php?\$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:$PHP_SOCK;
}
location ~ /\.ht {
deny all;
}
}
EOF
echo "🔗 사이트 활성화..."
sudo ln -sf /etc/nginx/sites-available/$DOMAIN /etc/nginx/sites-enabled/
echo "🧪 Nginx 테스트..."
sudo nginx -t
echo "🔁 Nginx 시작..."
sudo systemctl restart nginx
sudo systemctl restart php*-fpm || true
echo "🌐 HTTP 정상 동작 확인"
echo "👉 http://$DOMAIN"
# =====================
# 2️⃣ 인증서 발급
# =====================
echo "🔐 SSL 인증서 발급..."
# =====================
# 3️⃣ HTTPS 설정 적용
# =====================
echo "⚙️ Nginx HTTPS 설정 적용..."
sudo bash -c "cat > /etc/nginx/sites-available/$DOMAIN" <<EOF
# HTTP → HTTPS 리다이렉트
server {
listen 80;
server_name $DOMAIN www.$DOMAIN;
return 301 https://\$host\$request_uri;
}
# HTTPS 서버
server {
listen 443 ssl http2;
server_name $DOMAIN www.$DOMAIN;
root $WEBROOT;
index index.php index.html index.htm;
ssl_certificate /etc/letsencrypt/live/www.$DOMAIN/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.$DOMAIN/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
access_log /var/log/nginx/$DOMAIN.access.log;
error_log /var/log/nginx/$DOMAIN.error.log;
location / {
try_files \$uri \$uri/ /index.php?\$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:$PHP_SOCK;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires max;
log_not_found off;
}
location ~ /\.ht {
deny all;
}
}
EOF
echo "🧪 HTTPS 설정 테스트..."
sudo nginx -t
echo "🔁 Nginx 재시작..."
sudo systemctl reload nginx
# =====================
# 4️⃣ 자동 갱신
# =====================
echo "🔄 SSL 자동 갱신 설정..."
sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer
echo "🎉 전체 완료!"
echo "👉 https://www.$DOMAIN 접속"

(25) 설정한 파일의 권한 설정을 한 다음 실행한다.

chmod +x setup.sh
sudo ./setup.sh

(26) 크롬 브라우저에서 Ctrl+Shift+N 을 눌러서 시크릿 창으로 서버 주소를 입력해 접속해 본다.

(27) 다음 문서를 참고해서 방화벽 설정을 한다.

참고 : https://blog.naver.com/swkoo981/224126074215