RockyLinux 10 초기 서버 설정하기 - SELinux, Firewall, 필수 패키지 설치

  • 1st July 2026
  • 10 min read

본 문서는 RockyLinux 10.2 기반 웹서버 구축 시리즈의 첫 번째 글입니다. 이번 글에서는 PHP, nginx, MariaDB를 설치하기 전에 반드시 정리해두면 좋은 기본 서버 세팅을 다룹니다.

서버를 처음 설치한 뒤 곧바로 PHP나 nginx부터 설치하는 경우가 많지만, 운영 서버에서는 그 전에 패키지 관리 도구, 저장소, SELinux 상태, 방화벽 정책, 기본 점검 명령어를 먼저 정리해두는 것이 좋습니다. 이 단계가 제대로 정리되어 있어야 이후 PHP 8.5, MariaDB 11.8, nginx 모듈 컴파일, Certbot 인증서 발급 과정에서 불필요한 오류를 줄일 수 있습니다.

이 글에서는 RockyLinux 10.2 서버를 기준으로 기본 툴 설치, EPEL 저장소 활성화, SELinux 설정, firewalld 방화벽 설정, 서버 상태 확인 방법까지 순서대로 정리합니다.


1. RockyLinux 10.2 서버 기본 세팅의 목적

이 글의 목표는 복잡한 튜닝이 아닙니다. 웹서비스를 올리기 전에 서버가 정상적으로 패키지를 설치할 수 있고, 필요한 포트만 열려 있으며, 보안 정책 때문에 서비스가 예상치 못하게 막히지 않도록 기본 상태를 정리하는 것입니다.

이후 시리즈에서는 PHP 8.5, PHP-FPM, Valkey 세션, Oracle Client, nginx, MariaDB를 순서대로 설치할 예정입니다. 따라서 이번 단계에서는 운영 기반이 되는 최소 설정만 다룹니다.

  • 패키지 설치 준비: dnf, EPEL, wget, lynx 등 기본 도구를 설치합니다.

  • SELinux 상태 확인: 운영 방식에 따라 Enforcing, Permissive, Disabled 중 하나를 선택합니다.

  • 방화벽 포트 정리: 웹서비스에 필요한 HTTP, HTTPS, SSH 접근 정책을 설정합니다.

  • 기본 점검: OS 버전, 커널, IP, 서비스 상태를 확인합니다.

RockyLinux 10 계열은 RHEL 계열의 서버 운영 방식을 그대로 따르기 때문에, 패키지 설치는 dnf, 방화벽은 firewalld, 서비스 관리는 systemd를 기준으로 진행합니다.


2. 현재 서버 버전 확인

먼저 현재 서버가 어떤 버전의 RockyLinux인지 확인합니다. 운영 문서를 남길 때 이 정보는 매우 중요합니다. 나중에 PHP, MariaDB, nginx 버전이 바뀌었을 때 어떤 OS 기준으로 설치했는지 추적할 수 있기 때문입니다.

cat /etc/rocky-release
cat /etc/os-release
uname -r

예시는 다음과 같은 형태로 출력됩니다.

Rocky Linux release 10.2

uname -r은 현재 사용 중인 커널 버전을 확인하는 명령입니다. 패키지 업데이트 후 커널이 변경된 경우 재부팅 전에는 새 커널이 적용되지 않을 수 있으므로, 서버 초기 세팅 단계에서 확인해두는 것이 좋습니다.


3. 기본 필요 툴 설치

서버 운영에 필요한 기본 패키지를 먼저 설치합니다. 여기서는 epel-release, lynx, wget, dnf-plugins-core를 설치합니다.

dnf install -y epel-release lynx wget dnf-plugins-core

각 패키지의 역할은 다음과 같습니다.

  • epel-release: 기본 저장소에 없는 추가 패키지를 설치하기 위해 사용하는 EPEL 저장소 패키지입니다.

  • lynx: 터미널 환경에서 웹페이지를 확인할 수 있는 텍스트 기반 브라우저입니다. 서버 내부에서 HTTP 응답을 간단히 확인할 때 유용합니다.

  • wget: 외부 파일을 다운로드할 때 사용하는 명령어입니다. nginx 소스, 외부 rpm, 설치 파일을 받을 때 자주 사용합니다.

  • dnf-plugins-core: dnf config-manager 같은 저장소 관리 명령을 사용하기 위해 필요합니다.

EPEL은 Enterprise Linux 계열에서 널리 사용하는 추가 패키지 저장소입니다. RockyLinux 공식 문서에서도 dnf install epel-release 방식으로 EPEL을 설치할 수 있다고 안내하고 있습니다.

설치가 완료되면 현재 활성화된 저장소를 확인합니다.

dnf repolist

필요한 경우 CRB 저장소도 활성화할 수 있습니다. CRB는 CodeReady Builder 저장소이며, 일부 개발 라이브러리나 의존성 패키지를 설치할 때 필요할 수 있습니다.

dnf config-manager --set-enabled crb

모든 서버에서 반드시 필요한 것은 아니지만, nginx 모듈 컴파일이나 특정 개발 패키지 설치 중 의존성 문제가 발생한다면 CRB 활성화를 검토하는 것이 좋습니다.


4. 패키지 업데이트

기본 툴 설치 후에는 전체 패키지를 최신 상태로 업데이트합니다. 신규 서버를 받은 직후라면 설치 이미지가 최신 상태가 아닐 수 있습니다.

dnf update -y

업데이트 과정에서 커널 또는 systemd 관련 패키지가 변경되었다면 재부팅하는 것이 좋습니다.

shutdown -r now

재부팅 후에는 다시 접속해서 서버가 정상적으로 올라왔는지 확인합니다.

uptime
whoami
hostnamectl

uptime은 서버가 재부팅 후 얼마나 동작 중인지 확인할 수 있고, hostnamectl은 OS 정보와 호스트명을 확인할 수 있습니다.


5. SELinux 상태 확인

SELinux는 Linux 보안을 강화하기 위한 Mandatory Access Control 보안 체계입니다. 일반적인 파일 권한보다 더 강력한 접근 제어를 제공하므로, 보안 관점에서는 가능하면 사용하는 것이 좋습니다.

다만 PHP-FPM, nginx, 파일 업로드 디렉터리, 외부 마운트 경로, Oracle Client, 사용자별 홈 디렉터리 웹루트처럼 여러 요소가 섞인 서버에서는 SELinux 정책 때문에 서비스가 막히는 경우가 있습니다. 그래서 실무에서는 운영 난이도와 보안 요구 수준에 따라 SELinux 사용 여부를 결정합니다.

먼저 현재 상태를 확인합니다.

getenforce

출력값은 보통 다음 중 하나입니다.

  • Enforcing: SELinux 정책을 실제로 적용하고 차단합니다.

  • Permissive: 차단은 하지 않고 로그만 남깁니다.

  • Disabled: SELinux가 비활성화된 상태입니다.

이미 Disabled라면 추가 작업은 필요하지 않습니다.


6. SELinux를 비활성화하는 경우

단순 웹서버 운영, 내부망 서버, 개발 서버, 또는 SELinux 정책 관리에 익숙하지 않은 환경에서는 SELinux를 비활성화하고 운영하는 경우도 많습니다. 이 경우 아래 파일을 수정합니다.

vi /etc/selinux/config

아래 라인을 찾습니다.

SELINUX=enforcing

다음과 같이 수정합니다.

SELINUX=disabled

설정 변경 후에는 재부팅해야 완전히 적용됩니다.

shutdown -r now

재부팅 후 다시 확인합니다.

getenforce

아래처럼 출력되면 비활성화가 완료된 것입니다.

Disabled

단, 보안이 중요한 공공기관, 금융권, 외부 노출이 큰 서버에서는 SELinux를 무조건 끄는 방식보다 정책을 맞춰 사용하는 것이 더 바람직합니다. 이 글에서는 PHP/nginx/MariaDB 구축을 단순화하기 위한 기준으로 비활성화 절차를 정리합니다.


7. SELinux를 바로 끄지 않고 Permissive로 확인하는 방법

운영 서버에서 SELinux를 바로 끄기 부담스럽다면 먼저 Permissive 상태로 전환해 로그를 확인하는 방법도 있습니다. Permissive는 실제 차단은 하지 않지만 SELinux 정책 위반 로그를 남깁니다.

setenforce 0
getenforce

이 설정은 재부팅하면 원래 설정으로 돌아갑니다. 영구적으로 Permissive로 두려면 /etc/selinux/config 파일에서 아래처럼 수정합니다.

SELINUX=permissive

서비스가 막히는 원인이 SELinux인지 확인하고 싶을 때는 Permissive 전환 후 동일 작업을 다시 시도해보면 됩니다. Permissive 상태에서 정상 동작한다면 SELinux 정책 문제일 가능성이 높습니다.


8. firewalld 상태 확인

RockyLinux에서는 firewalld를 사용해 방화벽 정책을 관리합니다. firewalld는 zone 기반으로 네트워크 신뢰 수준을 나누고, 런타임 설정과 영구 설정을 분리해서 관리할 수 있습니다.

먼저 firewalld가 실행 중인지 확인합니다.

systemctl status firewalld

간단히 상태만 확인하려면 다음 명령을 사용할 수 있습니다.

firewall-cmd --state

실행 중이면 아래와 같이 출력됩니다.

running

방화벽을 사용하지 않는 서버라면 이 단계는 생략할 수 있습니다. 다만 외부에 노출되는 웹서버라면 방화벽을 사용하는 편이 안전합니다.


9. HTTP, HTTPS, SSH 서비스 허용

웹서버에서는 일반적으로 HTTP 80번 포트, HTTPS 443번 포트, SSH 22번 포트가 필요합니다. firewalld에서는 포트 번호를 직접 지정할 수도 있지만, 기본 서비스명으로 허용하는 방식이 더 읽기 쉽습니다.

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --permanent --zone=public --add-service=ssh

설정을 적용하려면 reload를 실행합니다.

firewall-cmd --reload

현재 적용된 설정을 확인합니다.

firewall-cmd --list-all

출력 결과의 services 항목에 http, https, ssh가 포함되어 있으면 정상입니다.

public
  target: default
  services: cockpit dhcpv6-client http https ssh

참고로 --permanent 옵션은 영구 설정에 반영한다는 뜻입니다. reload 전까지는 런타임에 즉시 반영되지 않습니다. 즉시 반영만 하고 재부팅 후 사라져도 되는 설정이라면 --permanent 없이 사용할 수 있지만, 운영 서버에서는 영구 설정으로 등록한 뒤 reload 하는 방식이 일반적입니다.


10. SSH 접근 정책 주의사항

위 예시에서는 SSH를 전체 허용했습니다. 하지만 운영 서버라면 SSH는 가능한 한 접근 IP를 제한하는 것이 좋습니다. 특히 22번 포트를 그대로 외부에 열어두면 무작위 로그인 시도가 지속적으로 발생할 수 있습니다.

특정 IP에서만 SSH를 허용하고 싶다면 rich rule을 사용할 수 있습니다. 예를 들어 111.222.333.444 IP에서만 SSH 접근을 허용하려면 다음과 같이 설정할 수 있습니다.

firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="111.222.333.444" service name="ssh" accept'
firewall-cmd --permanent --zone=public --remove-service=ssh
firewall-cmd --reload

단, 이 작업은 반드시 현재 접속 중인 IP를 정확히 확인한 뒤 진행해야 합니다. 잘못 설정하면 SSH 접속이 차단되어 서버 콘솔이나 호스팅 업체의 원격 콘솔을 통해 복구해야 할 수 있습니다.

현재 접속한 클라이언트 IP를 확인하려면 다음 명령을 사용할 수 있습니다.

echo $SSH_CLIENT

또는 SSH 로그에서 접속 IP를 확인할 수도 있습니다.

who
last -a | head

11. 방화벽을 사용하지 않는 경우

클라우드 보안그룹, IDC 상단 방화벽, 별도 네트워크 장비에서 이미 접근 제어를 하고 있다면 서버 내부 firewalld를 사용하지 않는 경우도 있습니다. 이 경우에는 현재 상태를 명확히 확인한 뒤 비활성화합니다.

systemctl stop firewalld
systemctl disable firewalld

하지만 이 방식은 서버 자체의 마지막 방어선을 제거하는 것이므로, 외부 방화벽 정책이 정확히 구성되어 있다는 전제가 필요합니다. 단독 VPS나 외부 노출 서버라면 firewalld를 유지하는 편을 권장합니다.


12. 서버 시간대 확인

PHP, MariaDB, 로그 분석, cron 작업을 안정적으로 운영하려면 서버 시간대가 정확해야 합니다. 한국 서비스라면 보통 Asia/Seoul로 설정합니다.

timedatectl

시간대가 다르다면 다음과 같이 변경합니다.

timedatectl set-timezone Asia/Seoul

다시 확인합니다.

timedatectl

PHP 설정에서도 date.timezone = Asia/Seoul을 지정할 예정이지만, OS 시간대도 함께 맞춰두는 것이 좋습니다.


13. 호스트명 설정

여러 대의 서버를 운영하다 보면 호스트명을 명확하게 지정해두는 것이 중요합니다. 로그, 모니터링, 백업, 배포 자동화에서 서버를 구분하기 쉬워집니다.

hostnamectl set-hostname web01.example.com

설정 후 확인합니다.

hostnamectl

내부용 서버라면 실제 도메인이 아니어도 web01, db01, dev-web01처럼 역할이 드러나는 이름을 사용하는 것이 좋습니다.


14. 네트워크 정보 확인

웹서버 세팅 전에는 IP 주소와 기본 라우팅 정보를 확인해두는 것이 좋습니다.

ip addr
ip route

DNS 조회가 정상인지도 확인합니다.

cat /etc/resolv.conf
ping -c 3 8.8.8.8
ping -c 3 google.com

IP로는 통신되는데 도메인으로 통신이 되지 않는다면 DNS 설정 문제일 가능성이 있습니다. 이후 Remi 저장소, MariaDB 저장소, nginx 소스 다운로드, Certbot 인증서 발급 과정에서 DNS 문제가 있으면 설치가 중단될 수 있으므로 초기에 확인하는 것이 좋습니다.


15. root 계정과 일반 사용자 계정

설치 작업은 대부분 root 권한으로 진행합니다. 다만 실제 웹 소스 파일을 root 소유로 운영하는 것은 권장하지 않습니다. PHP-FPM과 nginx에서 사용할 사용자 계정을 별도로 두는 것이 좋습니다.

예를 들어 USER라는 계정으로 웹 소스를 관리한다면 다음과 같이 생성할 수 있습니다.

useradd USER
passwd USER

웹 루트 디렉터리도 미리 생성해둘 수 있습니다.

mkdir -p /home/USER/src
chown -R USER:USER /home/USER/src

이후 PHP-FPM 설정에서는 user = USER, group = USER 형태로 프로세스 실행 계정을 지정할 수 있습니다. 이 부분은 2편 PHP 8.5 설치 글에서 자세히 다룹니다.


16. 기본 유틸리티 추가 설치

실제 운영에서는 아래 도구들도 자주 사용합니다. 필수는 아니지만 설치해두면 장애 확인이나 로그 분석이 편합니다.

dnf install -y vim net-tools bind-utils tar unzip zip lsof htop rsync curl git
  • vim: 설정 파일 편집용 에디터입니다.

  • net-tools: netstat 등 기존 네트워크 확인 명령을 사용할 수 있습니다.

  • bind-utils: dig, nslookup 등 DNS 확인 도구를 제공합니다.

  • lsof: 특정 포트를 어떤 프로세스가 사용 중인지 확인할 때 사용합니다.

  • rsync: 서버 간 파일 동기화나 배포에 사용합니다.

포트 사용 상태를 확인하는 명령은 다음과 같습니다.

ss -lntp
lsof -i :80
lsof -i :443

nginx나 php-fpm이 정상 실행되지 않을 때는 이미 해당 포트를 다른 프로세스가 사용 중인지 확인해야 합니다.


17. 설정 후 최종 점검

지금까지의 기본 설정이 끝났다면 아래 명령으로 현재 서버 상태를 정리해서 확인합니다.

cat /etc/rocky-release
hostnamectl
getenforce
firewall-cmd --state
firewall-cmd --list-all
timedatectl
dnf repolist

이 결과를 별도로 기록해두면 이후 PHP, nginx, MariaDB 설치 중 문제가 발생했을 때 원인을 추적하기 쉽습니다.


18. 이번 글에서 사용한 전체 명령어 요약

아래는 이번 글에서 사용한 핵심 명령어만 모아둔 것입니다. 서버 초기 세팅 시 빠르게 참고할 수 있습니다.

# OS 확인
cat /etc/rocky-release
cat /etc/os-release
uname -r

# 기본 패키지 설치
dnf install -y epel-release lynx wget dnf-plugins-core

# CRB 저장소 활성화가 필요한 경우
dnf config-manager --set-enabled crb

# 전체 업데이트
dnf update -y
shutdown -r now

# SELinux 확인
getenforce

# SELinux 비활성화 설정
vi /etc/selinux/config
# SELINUX=disabled
shutdown -r now

# firewalld 확인
systemctl status firewalld
firewall-cmd --state

# HTTP, HTTPS, SSH 허용
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --permanent --zone=public --add-service=ssh
firewall-cmd --reload
firewall-cmd --list-all

# 시간대 설정
timedatectl set-timezone Asia/Seoul
timedatectl

# 호스트명 설정
hostnamectl set-hostname web01.example.com
hostnamectl

# 운영 편의 도구 설치
dnf install -y vim net-tools bind-utils tar unzip zip lsof htop rsync curl git

마무리

이번 글에서는 RockyLinux 10.2 웹서버 구축을 시작하기 전 필요한 기본 서버 세팅을 정리했습니다. 서버 구축에서 가장 중요한 것은 각 프로그램을 설치하는 것보다, 설치 전에 운영 기준을 명확히 정하는 것입니다.

특히 SELinux와 firewalld는 서버 보안과 직접 연결되는 요소이므로 무조건 끄거나 무조건 켜는 방식이 아니라, 현재 서버가 놓인 환경과 운영자의 관리 역량에 맞게 결정해야 합니다. 내부망 개발 서버라면 단순성을 위해 비활성화할 수 있고, 외부 공개 운영 서버라면 가능한 한 방화벽과 보안 정책을 유지하는 편이 좋습니다.

다음 글에서는 이 기본 세팅 위에 PHP 8.5와 PHP-FPM을 설치하고, 웹서비스 운영에 필요한 PHP 설정을 정리하는 과정을 다룰 예정입니다.

#RockyLinux #RockyLinux10 #서버구축 #리눅스서버 #SELinux #firewalld #dnf #EPEL #웹서버구축 #IT


참고 자료

  • Rocky Linux 10 Documentation - Release Notes

  • Rocky Linux Documentation - DNF Package Manager

  • Rocky Linux Documentation - firewalld for Beginners

  • Rocky Linux Wiki - Rocky Linux Repositories