서버 설정 · 9 min read · Oct 02, 2025
완벽한 서버 - CentOS 7 x86_64 (nginx, Dovecot, ISPConfig 3)
완벽한 서버 - CentOS 7 x86_64 (nginx, Dovecot, ISPConfig 3)
버전 1.0
저자: Till Brehm, Srijan Kishore 및 Falko Timme
Twitter에서 howtoforge를 팔로우하세요
이 튜토리얼은 ISPConfig 3 설치를 위해 CentOS 7 x86_64 서버를 준비하는 방법과 ISPConfig 3을 설치하는 방법을 보여줍니다. ISPConfig 3은 웹 브라우저를 통해 다음 서비스를 구성할 수 있는 웹 호스팅 제어판입니다: nginx 웹 서버, Postfix 메일 서버, MySQL, BIND 네임서버, PureFTPd, SpamAssassin, ClamAV, Mailman 등. 버전 3.0.4부터 ISPConfig는 Apache 외에도 nginx 웹 서버에 대한 완전한 지원을 제공합니다. 이 튜토리얼은 Apache가 아닌 nginx를 사용하는 서버의 설정을 다룹니다. ISPConfig 3 Apache 완벽한 서버 튜토리얼은 여기에서 확인할 수 있습니다.
ISPConfig 3 매뉴얼
ISPConfig 3 사용 방법을 배우기 위해 ISPConfig 3 매뉴얼을 다운로드하는 것을 강력히 권장합니다.
약 300페이지에 걸쳐 ISPConfig의 개념(관리자, 리셀러, 클라이언트)을 다루고, ISPConfig 3 설치 및 업데이트 방법을 설명하며, ISPConfig의 모든 양식 및 양식 필드에 대한 참조와 유효한 입력 예제를 포함하고, ISPConfig 3에서 가장 일반적인 작업에 대한 튜토리얼을 제공합니다. 또한 서버를 더 안전하게 만드는 방법을 설명하고 마지막에 문제 해결 섹션이 포함되어 있습니다.
1. 요구 사항
이러한 시스템을 설치하려면 다음이 필요합니다.
- 가까운 미러에서 CentOS 7.0 DVD 두 개를 다운로드합니다 (미러 목록은 여기에서 확인할 수 있습니다: http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7.0-1406-x86_64-DVD.iso.
- 빠른 인터넷 연결
2. 사전 참고
이 튜토리얼에서는 호스트 이름 server1.example.com과 IP 주소 192.168.0.100 및 게이트웨이 192.168.0.1을 사용합니다. 이러한 설정은 귀하의 경우 다를 수 있으므로 적절한 곳에서 교체해야 합니다. 진행하기 전에 이 튜토리얼 링크에서 최소 CentOS 7 설치를 설치하십시오.
3 nano 편집기 설치 및 /etc/hosts 조정
yum -y install nano wget
다음으로 /etc/hosts를 편집합니다. 다음과 같이 만듭니다:
nano /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.0.100 server1.example.com server1
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6그리고 호스트 이름을 server1.example.com으로 설정합니다:
echo ‘server1.example.com’ > /etc/hostname
4 방화벽 구성 및 일부 기본 네트워크 소프트웨어 설치
(기본 시스템 설치가 끝날 때 방화벽을 이미 비활성화한 경우 이 장을 건너뛸 수 있습니다.)
이 튜토리얼의 끝에서 ISPConfig를 설치하고 싶습니다. ISPConfig는 자체 방화벽을 가지고 있습니다. 그래서 기본 CentOS 방화벽을 지금 비활성화합니다. 물론 방화벽을 켜두고 필요에 맞게 구성할 수 있습니다(하지만 그러면 나중에 다른 방화벽을 사용하지 않아야 합니다. 왜냐하면 그것이 CentOS 방화벽과 간섭할 가능성이 높기 때문입니다).
실행:
systemctl stop firewalld.service
systemctl disable firewalld.service
[root@server1 ~]# systemctl disable firewalld.service
rm ‘/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service’
rm ‘/etc/systemd/system/basic.target.wants/firewalld.service’
[root@server1 ~]#
방화벽을 비활성화합니다.
방화벽이 실제로 비활성화되었는지 확인하려면 다음을 실행할 수 있습니다:
firewall-cmd –state
그 후 출력은 다음과 같아야 합니다:
[root@server1 ~]# firewall-cmd –state
not running
[root@server1 ~]#
yum -y install net-tools NetworkManager-tui
5 SELinux 비활성화
SELinux는 CentOS의 보안 확장으로, 확장된 보안을 제공해야 합니다. 제 생각에는 안전한 시스템을 구성하는 데 필요하지 않으며, 일반적으로 장점보다 더 많은 문제를 일으킵니다(어떤 서비스가 예상대로 작동하지 않아 일주일 동안 문제 해결을 한 후, 모든 것이 괜찮았고 SELinux가 문제를 일으켰다는 것을 알게 되는 경우를 생각해 보세요). 따라서 비활성화합니다(나중에 ISPConfig를 설치하려면 반드시 필요합니다).
/etc/selinux/config를 편집하고 SELINUX=disabled로 설정합니다:
nano /etc/selinux/config
# 이 파일은 시스템에서 SELinux의 상태를 제어합니다.
# SELINUX=은 다음 세 가지 값 중 하나를 가질 수 있습니다:
# enforcing - SELinux 보안 정책이 시행됩니다.
# permissive - SELinux가 시행 대신 경고를 출력합니다.
# disabled - SELinux 정책이 로드되지 않습니다.
SELINUX=disabled
# SELINUXTYPE=은 다음 두 가지 값 중 하나를 가질 수 있습니다:
# targeted - 대상 프로세스가 보호됩니다,
# mls - 다중 수준 보안 보호.
SELINUXTYPE=targeted그 후 시스템을 재부팅해야 합니다:
reboot
6 추가 리포지토리 활성화 및 일부 소프트웨어 설치
CentOS 시스템에서 EPEL 리포지토리를 활성화할 것입니다. 이 튜토리얼에서 설치할 많은 패키지가 공식 CentOS 7.0 리포지토리에서 제공되지 않기 때문입니다:
yum -y install epel-release
yum -y install yum-priorities
/etc/yum.repos.d/epel.repo를 편집합니다…
nano /etc/yum.repos.d/epel.repo
… 그리고 [epel] 섹션에 priority=10을 추가합니다:
[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[...]그런 다음 시스템의 기존 패키지를 업데이트합니다:
yum update
이제 나중에 필요한 소프트웨어 패키지를 설치합니다:
yum -y groupinstall ‘Development Tools’
7 쿼터
(제가 선택한 파티션 구성과 다른 파티션 구성 방식을 선택한 경우, 쿼터가 필요한 파티션에 적용되도록 이 장을 조정해야 합니다.)
쿼터를 설치하려면 다음 명령을 실행합니다:
yum -y install quota
이제 웹사이트(/var/www) 및 메일 데이터(var/vmail)가 저장되는 파일 시스템에 대해 쿼터가 이미 활성화되었는지 확인합니다. 이 예제 설정에서는 하나의 큰 루트 파티션이 있으므로 ‘ / ‘를 검색합니다:
mount | grep ‘ / ‘
[root@server1 ~]# mount | grep ‘ / ‘
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)
[root@server1 ~]#
별도의 /var 파티션이 있는 경우, 다음을 사용하십시오:
mount | grep ‘ /var ‘
대신. 만약 줄에 “ noquota “라는 단어가 포함되어 있다면, 쿼터를 활성화하기 위해 다음 단계를 진행합니다.
/ (루트) 파티션에서 쿼터 활성화
일반적으로 /etc/fstab 파일에서 쿼터를 활성화하지만, 파일 시스템이 루트 파일 시스템인 경우 “ / “에서 쿼터는 Linux 커널의 부팅 매개변수로 활성화해야 합니다.
grub 구성 파일을 편집합니다:
nano /etc/default/grub
GRUB_CMDLINE_LINUX로 시작하는 줄을 검색하고 rootflags=uquota,gquota를 명령줄 매개변수에 추가하여 결과 줄이 다음과 같아 보이도록 합니다:
[...]
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos/root crashkernel=auto vconsole.keymap=us rhgb quiet rootflags=uquota,gquota"
[...] 변경 사항을 적용하려면 다음 명령을 실행합니다.
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg_bak
grub2-mkconfig -o /boot/grub2/grub.cfg
서버를 재부팅합니다.
reboot
이제 쿼터가 활성화되었는지 확인합니다:
mount | grep ‘ / ‘
[root@server1 ~]# mount | grep ‘ / ‘
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,usrquota,grpquota)
[root@server1 ~]#
쿼터가 활성화되면 마운트 옵션 목록에서 “ usrquota,grpquota “를 볼 수 있습니다.
별도의 /var 파티션에서 쿼터 활성화
별도의 /var 파티션이 있는 경우, /etc/fstab을 편집하고 / 파티션(/dev/mapper/centos-var)에 ,uquota,gquota를 추가합니다:
nano /etc/fstab
#
# /etc/fstab
# Anaconda에 의해 2014년 9월 21일 일요일 16:33:45에 생성됨
#
# 참조에 의해 접근 가능한 파일 시스템은 '/dev/disk' 아래에 유지됩니다.
# fstab(5), findfs(8), mount(8) 및/또는 blkid(8)에 대한 매뉴얼 페이지를 참조하십시오.
#
/dev/mapper/centos-root / xfs defaults 1 1
/dev/mapper/centos-var /var xfs defaults,uquota,gquota 1 2
UUID=9ac06939-7e43-4efd-957a-486775edd7b4 /boot xfs defaults 1 3
/dev/mapper/centos-swap swap swap defaults 0 0그런 다음 실행합니다:
mount -o remount /var
quotacheck -avugm
quotaon -avug
쿼터를 활성화합니다.
8 시스템 시계 동기화
시스템 시계를 인터넷의 NTP ( n etwork t ime p rotocol) 서버와 동기화하는 것은 좋은 생각입니다. 간단히 실행합니다:
yum -y install ntp
그러면 시스템 시간이 항상 동기화됩니다.
9 MariaDB 설치
다음과 같이 MariaDB 서버 및 클라이언트를 설치합니다:
yum -y install mariadb mariadb-server
부팅 시 MariaDB 서비스가 실행되도록 하고 서비스를 시작합니다:
systemctl enable mariadb.service
systemctl start mariadb.service
MySQL 루트 계정의 비밀번호를 설정합니다:
mysql_secure_installation
[root@server1 ~]# mysql_secure_installation
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not found
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
MariaDB에 로그인하여 보안을 설정하려면 현재
루트 사용자에 대한 비밀번호가 필요합니다. MariaDB를 방금 설치했으며, 루트 비밀번호를 아직 설정하지 않았다면 비밀번호는 비어 있으므로 여기에서 그냥 Enter를 누르십시오. <–ENTER
현재 루트 비밀번호를 입력하십시오(없으면 Enter를 누르십시오): <–ENTER
OK, 비밀번호를 성공적으로 사용했습니다. 계속 진행합니다…
루트 비밀번호를 설정하면 아무도 적절한 권한 없이 MariaDB 루트 사용자로 로그인할 수 없게 됩니다.
루트 비밀번호를 설정하시겠습니까? [Y/n] <–ENTER
새 비밀번호: <–yourmariadbpassword
새 비밀번호를 다시 입력하십시오: <–yourmariadbpassword
비밀번호가 성공적으로 업데이트되었습니다!
권한 테이블을 다시 로드합니다..
… 성공!
기본적으로 MariaDB 설치에는 익명 사용자가 있어 누구나 사용자 계정을 만들지 않고도 MariaDB에 로그인할 수 있습니다. 이는 테스트 전용이며 설치를 조금 더 원활하게 진행하기 위한 것입니다. 프로덕션 환경으로 이동하기 전에 이를 제거해야 합니다.
익명 사용자를 제거하시겠습니까? [Y/n] <–ENTER
… 성공!
일반적으로 루트는 ‘localhost’에서만 연결할 수 있어야 합니다. 이는 누군가가 네트워크에서 루트 비밀번호를 추측할 수 없도록 보장합니다.
원격에서 루트 로그인을 금지하시겠습니까? [Y/n] <–ENTER
… 성공!
기본적으로 MariaDB에는 누구나 접근할 수 있는 ‘test’라는 데이터베이스가 있습니다. 이는 테스트 전용이며 프로덕션 환경으로 이동하기 전에 제거해야 합니다.
테스트 데이터베이스 및 접근 권한을 제거하시겠습니까? [Y/n] <–ENTER
- 테스트 데이터베이스 삭제…
… 성공! - 테스트 데이터베이스에 대한 권한 제거…
… 성공!
권한 테이블을 다시 로드하면 지금까지 변경된 모든 사항이 즉시 적용됩니다.
권한 테이블을 지금 다시 로드하시겠습니까? [Y/n] <–ENTER
… 성공!
정리 중…
모두 완료되었습니다! 위의 모든 단계를 완료했다면 MariaDB 설치가 이제 안전해야 합니다.
MariaDB를 사용해 주셔서 감사합니다!
[root@server1 ~]#
10 Dovecot 설치
Dovecot은 다음과 같이 설치할 수 있습니다:
yum -y install dovecot dovecot-pigeonhole dovecot-mysql
빈 dovecot-sql.conf 파일을 만들고 심볼릭 링크를 생성합니다:
touch /etc/dovecot/dovecot-sql.conf
ln -s /etc/dovecot/dovecot-sql.conf /etc/dovecot-sql.conf
이제 시스템 시작 링크를 만들고 Dovecot을 시작합니다:
systemctl enable dovecot.service
systemctl start dovecot.service
11 Postfix 설치
Postfix는 다음과 같이 설치할 수 있습니다:
yum -y install postfix
그런 다음 Sendmail을 끄고 Postfix를 시작합니다:
systemctl enable mariadb.service
systemctl start mariadb.service
systemctl stop sendmail.service
systemctl disable sendmail.service
systemctl enable postfix.service
systemctl restart postfix.service
12 Getmail 설치
Getmail은 다음과 같이 설치할 수 있습니다:
yum -y install getmail
13 Amavisd-new, SpamAssassin 및 ClamAV 설치
amavisd-new, spamassassin 및 clamav를 설치하려면 다음 명령을 실행합니다:
yum -y install amavisd-new spamassassin clamav clamd clamav-update unzip bzip2 unrar perl-DBD-mysql
freshclam 구성 파일 /etc/freshclam.conf를 편집합니다.
nano /etc/freshclam.conf
그리고 “Example” 줄을 주석 처리합니다.
[….]
[….]
그런 다음 freshclam, amavisd 및 clamd.amavisd를 시작합니다:
sa-update
freshclam
systemctl enable amavisd.service
14 Nginx, PHP5 (PHP-FPM) 및 Fcgiwrap 설치
Nginx는 CentOS 7.0(EPEL에서) 패키지로 제공되며 다음과 같이 설치할 수 있습니다:
yum -y install nginx
시스템에 Apache2가 이미 설치되어 있다면 지금 중지합니다…
systemctl stop httpd.service
… 그리고 Apache의 시스템 시작 링크를 제거합니다:
systemctl disable httpd.service
그런 다음 nginx의 시스템 시작 링크를 만들고 시작합니다:
systemctl enable nginx.service
systemctl start nginx.service
(만약 Apache2와 nginx가 모두 설치되어 있다면, ISPConfig 3 설치 프로그램이 어떤 것을 사용할지 물어볼 것입니다 - 이 경우 nginx라고 대답하십시오. 이 두 가지 중 하나만 설치되어 있다면, ISPConfig는 필요한 구성을 자동으로 수행합니다.)
PHP5를 nginx에서 PHP-FPM을 통해 작동하게 만들 수 있습니다(PHP-FPM (FastCGI Process Manager)은 추가 기능이 있는 대안 PHP FastCGI 구현으로, 특히 더 바쁜 사이트에 유용합니다). PHP-FPM과 함께 php-cli 및 MySQL을 PHP 스크립트에서 사용하려면 필요한 php-mysql과 같은 PHP5 모듈을 다음과 같이 설치할 수 있습니다:
yum -y install php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-pecl-apc php-magickwand php-mbstring php-mcrypt php-mssql php-snmp php-soap php-tidy
다음으로 /etc/php.ini를 엽니다…
nano /etc/php.ini
… 그리고 오류 보고를 변경합니다(경고가 더 이상 표시되지 않도록):
[...]
;error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
error_reporting = E_ALL & ~E_NOTICE
[...]또한 cgi.fix_pathinfo=0으로 설정합니다:
nano /etc/php.ini
[...]
; cgi.fix_pathinfo는 CGI에 대한 *실제* PATH_INFO/PATH_TRANSLATED 지원을 제공합니다. PHP의
; 이전 동작은 PATH_TRANSLATED를 SCRIPT_FILENAME으로 설정하고 PATH_INFO가 무엇인지 이해하지 못하는 것이었습니다. PATH_INFO에 대한 자세한 내용은 CGI 사양을 참조하십시오. 이를 1로 설정하면 PHP CGI가 경로를 사양에 맞게 수정합니다. 0으로 설정하면 PHP가 이전과 같이 동작합니다. 기본값은 1입니다. 스크립트를 수정하여 SCRIPT_FILENAME을 사용해야 합니다.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...](왜 이렇게 해야 하는지에 대한 자세한 내용은 http://wiki.nginx.org/Pitfalls를 읽어보십시오.)
또한 PHP 스크립트를 브라우저에서 호출할 때 /var/log/php-fpm/www-error.log에서 다음과 같은 오류를 피하기 위해 /etc/php.ini에서 date.timezone을 설정해야 합니다:
[...]
[Date]
; 날짜 함수에서 사용하는 기본 시간대 정의
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = "Europe/Berlin"
[...]다음으로 php-fpm의 시스템 시작 링크를 만들고 시작합니다:
systemctl enable php-fpm
systemctl restart php-fpm
PHP-FPM은 포트 9000에서 FastCGI 서버를 실행하는 데몬 프로세스입니다(초기 스크립트는 /etc/init.d/php-fpm입니다).
nginx에서 CGI 지원을 얻기 위해 Fcgiwrap을 설치합니다.
Fcgiwrap은 복잡한 CGI 스크립트에도 작동해야 하는 CGI 래퍼로, 각 가상 호스트가 자신의 cgi-bin 디렉토리를 사용할 수 있게 해주기 때문에 공유 호스팅 환경에서 사용할 수 있습니다.
CentOS 7.0에 대한 fcgiwrap 패키지가 없으므로 직접 빌드해야 합니다. 먼저 몇 가지 필수 패키지를 설치합니다:
yum -y install fcgi-devel
이제 다음과 같이 fcgiwrap을 빌드할 수 있습니다:
cd /usr/local/src/
git clone git://github.com/gnosek/fcgiwrap.git
cd fcgiwrap
autoreconf -i
./configure
make
make install
이렇게 하면 fcgiwrap이 /usr/local/sbin/fcgiwrap에 설치됩니다.
다음으로 fcgiwrap을 데몬으로 실행할 수 있게 해주는 spawn-fcgi 패키지를 설치합니다:
yum -y install spawn-fcgi
/etc/sysconfig/spawn-fcgi를 엽니다…
nano /etc/sysconfig/spawn-fcgi
… 그리고 파일을 다음과 같이 수정합니다:
# "spawn-fcgi" 서비스가 작동하려면 몇 가지 작업 옵션을 설정해야 합니다.
# SOCKET이 파일을 가리키면 이 파일은 초기 스크립트에 의해 정리됩니다.
#
# 모든 가능한 옵션에 대해서는 spawn-fcgi(1)를 참조하십시오.
#
# 예:
#SOCKET=/var/run/php-fcgi.sock
#OPTIONS="-u apache -g apache -s $SOCKET -S -M 0600 -C 32 -F 1 -P /var/run/spawn-fcgi.pid -- /usr/bin/php-cgi"
FCGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/local/sbin/fcgiwrap
FCGI_USER=apache
FCGI_GROUP=apache
FCGI_EXTRA_OPTIONS="-M 0770"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"이제 nginx 사용자를 apache 그룹에 추가합니다:
usermod -a -G apache nginx
spawn-fcgi의 시스템 시작 링크를 생성합니다…
chkconfig spawn-fcgi on
… 그리고 다음과 같이 시작합니다:
systemctl start spawn-fcgi
이제 /var/run/fcgiwrap.socket에서 fcgiwrap 소켓을 찾아야 하며, 이는 사용자 및 그룹 apache가 소유합니다(일부 스크립트, 예: Mailman은 apache 사용자/그룹으로 실행되기를 기대하므로, nginx 사용자/그룹으로 spawn-fcgi를 실행하지 않고 nginx를 apache 그룹에 추가합니다).
14.1 추가 PHP 버전
ISPConfig 3.0.5부터는 하나의 서버에서 여러 PHP 버전을 사용할 수 있으며(ISPConfig를 통해 선택 가능), FastCGI 및 PHP-FPM을 통해 실행할 수 있습니다. CentOS에서 추가 PHP 버전을 빌드하는 절차는 이 튜토리얼에 설명되어 있습니다: ISPConfig 3와 함께 여러 PHP 버전 사용 방법 (PHP-FPM & FastCGI) (CentOS 6.3)
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.