Máy chủ hoàn hảo - CentOS 7 x86_64 (nginx, Dovecot, ISPConfig 3)

theanh

Administrator
Nhân viên

Máy chủ hoàn hảo - CentOS 7 x86_64 (nginx, Dovecot, ISPConfig 3)​

Phiên bản 1.0
Tác giả: Till Brehm, Srijan Kishore và Falko Timme
Theo dõi howtoforge trên Twitter


Hướng dẫn này chỉ cách chuẩn bị máy chủ CentOS 7 x86_64 để cài đặt ISPConfig 3 và cách cài đặt ISPConfig 3 trên máy chủ đó. ISPConfig 3 là bảng điều khiển lưu trữ web cho phép bạn định cấu hình các dịch vụ sau thông qua trình duyệt web: máy chủ web nginx, máy chủ thư Postfix, MySQL, máy chủ tên BIND, PureFTPd, SpamAssassin, ClamAV, Mailman và nhiều dịch vụ khác. Từ phiên bản 3.0.4, ISPConfig hỗ trợ đầy đủ cho máy chủ web nginx ngoài Apache; hướng dẫn này bao gồm thiết lập máy chủ sử dụng nginx, không phải Apache. Hướng dẫn máy chủ hoàn hảo của ISPConfig 3 Apache có sẵn tại đây.


Sổ tay hướng dẫn ISPConfig 3​
Để tìm hiểu cách sử dụng ISPConfig 3, tôi thực sự khuyên bạn nên tải xuống Sổ tay hướng dẫn ISPConfig 3.

Với khoảng 300 trang, tài liệu này trình bày khái niệm đằng sau ISPConfig (quản trị viên, đại lý, khách hàng), giải thích cách cài đặt và cập nhật ISPConfig 3, bao gồm tài liệu tham khảo cho tất cả các biểu mẫu và trường biểu mẫu trong ISPConfig cùng với các ví dụ về đầu vào hợp lệ và cung cấp hướng dẫn cho các tác vụ phổ biến nhất trong ISPConfig 3. Tài liệu này cũng chỉ ra cách bảo mật máy chủ của bạn hơn và có phần khắc phục sự cố ở cuối.


1. Yêu cầu​

Để cài đặt một hệ thống như vậy, bạn sẽ cần những thứ sau

2. Lưu ý sơ bộ​

Trong hướng dẫn này, tôi sử dụng tên máy chủ server1.example.com với địa chỉ IP 192.168.0.100 và cổng 192.168.0.1. Các thiết lập này có thể khác nhau đối với bạn, vì vậy bạn phải thay thế chúng khi thích hợp. Vui lòng cài đặt bản cài đặt CentOS 7 tối thiểu từ liên kết hướng dẫn này trước khi tiếp tục.


3 Cài đặt nano editor và điều chỉnh /etc/hosts​

yum -y install nano wget

Tiếp theo, chúng ta chỉnh sửa /etc/hosts. Làm cho nó trông như thế này:

nano /etc/hosts
Mã:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4192.168.0.100 server1.example.com server1::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
và đặt tên máy chủ thành server1.example.com:

echo 'server1.example.com' > /etc/hostname


4 Cấu hình Tường lửa và cài đặt một số phần mềm mạng cơ bản​

(Bạn có thể bỏ qua chương này nếu bạn đã tắt tường lửa ở cuối quá trình cài đặt hệ thống cơ bản.)

Tôi muốn cài đặt ISPConfig ở cuối hướng dẫn này, phần mềm này đi kèm với tường lửa riêng. Đó là lý do tại sao tôi tắt tường lửa CentOS mặc định ngay bây giờ. Tất nhiên, bạn có thể thoải mái bật và cấu hình theo nhu cầu của mình (nhưng sau đó bạn không nên sử dụng bất kỳ tường lửa nào khác vì rất có thể nó sẽ can thiệp vào tường lửa CentOS).

Chạy

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 ~]#
và tắt tường lửa.

Để kiểm tra xem tường lửa đã thực sự bị tắt hay chưa, bạn có thể chạy

firewall-cmd --state

sau đó. Đầu ra sẽ trông như thế này:

[root@server1 ~]# firewall-cmd --state
not running
[root@server1 ~]#

yum -y install net-tools NetworkManager-tui


5 Vô hiệu hóa SELinux​

SELinux là tiện ích mở rộng bảo mật của CentOS, cung cấp khả năng bảo mật mở rộng. Theo tôi, bạn không cần nó để cấu hình hệ thống bảo mật và nó thường gây ra nhiều vấn đề hơn là lợi ích (hãy nghĩ đến điều đó sau một tuần khắc phục sự cố vì một số dịch vụ không hoạt động như mong đợi, rồi bạn phát hiện ra rằng mọi thứ đều ổn, chỉ có SELinux gây ra sự cố). Do đó, tôi đã tắt nó (điều này là bắt buộc nếu bạn muốn cài đặt ISPConfig sau này).

Chỉnh sửa /etc/selinux/config và đặt SELINUX=disabled:

nano /etc/selinux/config
Mã:
# Tệp này kiểm soát trạng thái của SELinux trên hệ thống.# SELINUX= có thể lấy một trong ba giá trị sau:# enforcing - Chính sách bảo mật của SELinux được thực thi.# permissive - SELinux in cảnh báo thay vì thực thi.# disabled - Không có chính sách SELinux nào được tải.SELINUX=bị vô hiệu hóa# SELINUXTYPE= có thể sử dụng một trong hai giá trị sau:# nhắm mục tiêu - Các quy trình được nhắm mục tiêu được bảo vệ,# mls - Bảo vệ bảo mật nhiều cấp độ.SELINUXTYPE=targeted
Sau đó, chúng ta phải khởi động lại hệ thống:

khởi động lại

6 Kích hoạt các kho lưu trữ bổ sung và cài đặt một số phần mềm​

Chúng ta sẽ kích hoạt các kho lưu trữ EPEL trên hệ thống CentOS của mình vì nhiều gói mà chúng ta sẽ cài đặt trong quá trình hướng dẫn này không có sẵn trong các kho lưu trữ CentOS 7.0 chính thức:

yum -y install epel-release

yum -y install yum-priorities

Chỉnh sửa /etc/yum.repos.d/epel.repo...

nano /etc/yum.repos.d/epel.repo

... và thêm dòng priority=10 vào phần [epel]:
Mã:
[epel]name=Gói bổ sung cho Enterprise Linux 7 - $basearch#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearchmirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearchfailovermethod=priorityenabled=1priority=10gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7[...]
Sau đó, chúng tôi cập nhật các gói hiện có trên hệ thống:

yum update

Bây giờ, chúng tôi cài đặt một số gói phần mềm cần thiết sau này:

yum -y groupinstall 'Công cụ phát triển'


7 Quota​

(Nếu bạn đã chọn một lược đồ phân vùng khác với tôi, bạn phải điều chỉnh chương này để hạn ngạch áp dụng cho các phân vùng mà bạn cần.)

Để cài đặt hạn ngạch, chúng ta chạy lệnh này:

yum -y install quota

Bây giờ chúng ta kiểm tra xem hạn ngạch đã được bật cho hệ thống tệp nơi lưu trữ dữ liệu trang web (/var/www) và maildir (var/vmail) hay chưa. Trong ví dụ thiết lập này, tôi có một phân vùng gốc lớn, vì vậy tôi tìm kiếm ' / ':

mount | grep ' / '

[root@server1 ~]# mount | grep ' / '/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)[root@server1 ~]#

Nếu bạn có phân vùng /var riêng, hãy sử dụng:

mount | grep ' /var '

thay thế. Nếu dòng chứa từ "noquota", hãy tiến hành các bước sau để bật hạn ngạch.


Bật hạn ngạch trên phân vùng / (root)​
Thông thường, bạn sẽ bật hạn ngạch trong tệp /etc/fstab, nhưng nếu hệ thống tệp là hệ thống tệp gốc "/", thì hạn ngạch phải được bật bằng tham số khởi động của Hạt nhân Linux.

Chỉnh sửa tệp cấu hình grub:

nano /etc/default/grub

tìm kiếm theo dòng bắt đầu bằngGRUB_CMDLINE_LINUXvà thêmrootflags=uquota,gquotavào các tham số dòng lệnh để dòng kết quả trông như thế này:
Mã:
[...]

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"
[...]
và áp dụng các thay đổi bằng cách chạy lệnh sau.



cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg_bakgrub2-mkconfig -o /boot/grub2/grub.cfg

và khởi động lại máy chủ.

khởi động lại

Bây giờ hãy kiểm tra xem hạn ngạch đã được bật chưa:

mount | grep ' / '

[root@server1 ~]# mount | grep ' / '/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,usrquota,grpquota)[root@server1 ~]#

Khi quota đang hoạt động, chúng ta có thể thấy "usrquota,grpquota" trong danh sách tùy chọn gắn kết.


Bật hạn ngạch trên phân vùng /var riêng​

Nếu bạn có phân vùng /var riêng, hãy chỉnh sửa/etc/fstabvà thêm,uquota,gquotavào/phân vùng (/dev/mapper/centos-var):

nano /etc/fstab
Mã:
## /etc/fstab# Được tạo bởi anaconda vào CN 21/9 16:33:45 2014## Các hệ thống tệp có thể truy cập, theo tham chiếu, được duy trì trong '/dev/disk'# Xem các trang hướng dẫn fstab(5), findfs(8), mount(8) và/hoặc blkid(8) để biết thêm thông tin#/dev/mapper/centos-root / xfs defaults 1 1/dev/mapper/centos-var /var xfs defaults,uquota,gquota  1 2UUID=9ac06939-7e43-4efd-957a-486775edd7b4 /boot xfs defaults 1 3/dev/mapper/centos-swap swap swap defaults 0 0


Sau đó chạy

mount -o remount /var

quotacheck -avugmquotaon -avug

để kích hoạt quota.


8 Đồng bộ hóa đồng hồ hệ thống​

Bạn nên đồng bộ hóa đồng hồ hệ thống với NTP (mạngthời gian máy chủ protocol) qua Internet. Chỉ cần chạy

yum -y install ntp

và thời gian hệ thống của bạn sẽ luôn đồng bộ.


9 Cài đặt MariaDB​

Chúng tôi sẽ cài đặt máy chủ MariaDB và máy khách như sau:

yum -y install mariadb mariadb-server

Chúng tôi muốn dịch vụ Mariadb chạy khi khởi động và sau khi khởi động, và khởi động dịch vụ như sau:

systemctl enable mariadb.service
systemctl start mariadb.service

Đặt mật khẩu cho tài khoản gốc MySQL:

mysql_secure_installation

[root@server1 ~]# mysql_secure_installation
/usr/bin/mysql_secure_installation: dòng 379: find_mysql_client: lệnh không tìm thấy

LƯU Ý: KHUYẾN NGHỊ CHẠY TẤT CẢ CÁC PHẦN CỦA Script này CHO TẤT CẢ CÁC MÁY CHỦ
MariaDB ĐANG SỬ DỤNG TRONG SẢN XUẤT! VUI LÒNG ĐỌC KỸ TỪNG BƯỚC!

Để đăng nhập vào MariaDB để bảo mật, chúng ta cần có
mật khẩu hiện tại của người dùng root. Nếu bạn vừa cài đặt MariaDB và
bạn chưa đặt mật khẩu root, mật khẩu sẽ để trống,
do đó, bạn chỉ cần nhấn enter ở đây.<--ENTER

Nhập mật khẩu hiện tại cho root (nhập nếu không có): <--ENTER
OK, mật khẩu đã sử dụng thành công, tiếp tục...

Đặt mật khẩu root đảm bảo rằng không ai có thể đăng nhập vào MariaDB
người dùng root mà không có quyền thích hợp.

Đặt mật khẩu root? [Y/n]<--ENTER
Mật khẩu mới: <--yourmariadbpassword
Nhập lại mật khẩu mới: <--yourmariadbpassword
Mật khẩu đã được cập nhật thành công!
Đang tải lại bảng đặc quyền..
... Thành công!


Theo mặc định, cài đặt MariaDB có một người dùng ẩn danh, cho phép bất kỳ ai
đăng nhập vào MariaDB mà không cần phải tạo tài khoản người dùng cho
họ. Điều này chỉ nhằm mục đích thử nghiệm và để quá trình cài đặt
diễn ra suôn sẻ hơn một chút. Bạn nên xóa những người dùng ẩn danh này trước khi chuyển sang
môi trường sản xuất.

Xóa người dùng ẩn danh? [Y/n] <--ENTER
... Thành công!

Thông thường, root chỉ được phép kết nối từ 'localhost'. Điều này
đảm bảo rằng không ai có thể đoán được mật khẩu root từ mạng.

Không cho phép root đăng nhập từ xa? [Y/n]<--ENTER
... Thành công!

Theo mặc định, MariaDB đi kèm với một cơ sở dữ liệu có tên là 'test' mà bất kỳ ai cũng có thể
truy cập. Cơ sở dữ liệu này cũng chỉ dành cho mục đích thử nghiệm và cần phải xóa
trước khi chuyển sang môi trường sản xuất.

Xóa cơ sở dữ liệu thử nghiệm và quyền truy cập vào cơ sở dữ liệu đó? [Y/n]<--ENTER
- Đang xóa cơ sở dữ liệu thử nghiệm...
... Thành công!
- Xóa các đặc quyền trên cơ sở dữ liệu thử nghiệm...
... Thành công!

Tải lại các bảng đặc quyền sẽ đảm bảo rằng tất cả các thay đổi được thực hiện cho đến nay
sẽ có hiệu lực ngay lập tức.

Tải lại các bảng đặc quyền ngay bây giờ? [Y/n] <--ENTER
... Thành công!

Đang dọn dẹp...

Xong! Nếu bạn đã hoàn tất tất cả các bước trên, thì cài đặt MariaDB của bạn hiện đã an toàn.

Cảm ơn bạn đã sử dụng MariaDB!
[root@server1 ~]#


10 Cài đặt Dovecot​

Dovecot có thể được cài đặt như sau:

yum -y install dovecot dovecot-pigeonhole dovecot-mysql

Tạo một tệp dovecot-sql.conf trống và liên kết tượng trưng:

touch /etc/dovecot/dovecot-sql.confln -s /etc/dovecot/dovecot-sql.conf /etc/dovecot-sql.conf

Bây giờ hãy tạo các liên kết khởi động hệ thống và khởi động Dovecot:

systemctl enable dovecot.service
systemctl start dovecot.service


11 Cài đặt Postfix​

Postfix có thể được cài đặt như sau:

yum -y install postfix

Sau đó tắt Sendmail và khởi động 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 Cài đặt Getmail​

Getmail có thể được cài đặt như sau:

yum -y install getmail


13 Cài đặt Amavisd-new, SpamAssassin và ClamAV​

Để cài đặt amavisd-new, spamassassin và clamav, hãy chạy lệnh sau:

yum -y install amavisd-new spamassassin clamav clamd clamav-update unzip bzip2 unrar perl-DBD-mysql



Chỉnh sửa tệp cấu hình freshclam /etc/freshclam.conf

nano /etc/freshclam.conf

và chú thích dòng "Example"

[....]# Ví dụ[....]

Sau đó, chúng ta khởi động freshclam, amavisd và clamd.amavisd:

sa-updatefreshclamsystemctl enable amavisd.service


14 Cài đặt Nginx, PHP5 (PHP-FPM) và Fcgiwrap​

Nginx có sẵn dưới dạng gói cho CentOS 7.0 (từ EPEL) mà chúng ta có thể cài đặt như sau:

yum -y install nginx

Nếu Apache2 đã được cài đặt trên hệ thống, hãy dừng nó ngay bây giờ...

systemctl stop httpd.service

... và xóa các liên kết khởi động hệ thống của Apache:

systemctl disable httpd.service

Sau đó, chúng ta tạo các liên kết khởi động hệ thống cho nginx và khởi động nó:

systemctl enable nginx.service
systemctl start nginx.service


(Nếu cả Apache2 và nginx đều được cài đặt, trình cài đặt ISPConfig 3 sẽ hỏi bạn muốn sử dụng cái nào - hãy trả lời nginx trong trường hợp này. Nếu chỉ cài đặt một trong hai, ISPConfig sẽ tự động thực hiện cấu hình cần thiết.)

Chúng ta có thể khiến PHP5 hoạt động trong nginx thông qua PHP-FPM (PHP-FPM (FastCGI Process Manager) là một triển khai PHP FastCGI thay thế với một số tính năng bổ sung hữu ích cho các trang web có mọi quy mô, đặc biệt là các trang web có nhiều người truy cập). Chúng ta có thể cài đặt php-fpm cùng với php-cli và một số module PHP5 như php-mysql mà bạn cần nếu muốn sử dụng MySQL từ các tập lệnh PHP của mình như sau:

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

Tiếp theo, chúng ta mở /etc/php.ini...

nano /etc/php.ini

... và thay đổi báo cáo lỗi (để thông báo không hiển thị nữa):
Mã:
[...];error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICTerror_reporting = E_ALL & ~E_NOTICE[...]
Ngoài ra, hãy đặt cgi.fix_pathinfo=0:

nano /etc/php.ini
Mã:
[...]; cgi.fix_pathinfo cung cấp hỗ trợ PATH_INFO/PATH_TRANSLATED *thực* cho CGI. PHP's; hành vi trước đây là đặt PATH_TRANSLATED thành SCRIPT_FILENAME và không hiểu; PATH_INFO là gì. Để biết thêm thông tin về PATH_INFO, hãy xem thông số kỹ thuật cgi. Thiết lập; thành 1 sẽ khiến PHP CGI sửa đường dẫn của nó để tuân thủ thông số kỹ thuật. Thiết lập; bằng không khiến PHP hoạt động như trước. Mặc định là 1. Bạn nên sửa các tập lệnh của mình; để sử dụng SCRIPT_FILENAME thay vì PATH_TRANSLATED.; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfocgi.fix_pathinfo=0[...]
(Vui lòng đọc http://wiki.nginx.org/Pitfalls để tìm hiểu lý do tại sao bạn nên làm như vậy.)

Ngoài ra, để tránh các lỗi như

[08-08-2011 18:07:08] Cảnh báo PHP: phpinfo(): Không an toàn khi dựa vào cài đặt múi giờ của hệ thống. Bạn *bắt buộc* phải sử dụng cài đặt date.timezone hoặc hàm date_default_timezone_set(). Trong trường hợp bạn đã sử dụng bất kỳ phương pháp nào trong số các phương pháp đó và bạn vẫn nhận được cảnh báo này, rất có thể bạn đã viết sai định danh múi giờ. Chúng tôi đã chọn 'Europe/Berlin' cho 'CEST/2.0/DST' thay vì trong /usr/share/nginx/html/info.php ở dòng 2

... trong /var/log/php-fpm/www-error.log khi bạn gọi một tập lệnh PHP trong trình duyệt của mình, bạn nên đặt date.timezone trong /etc/php.ini:
Mã:
[...][Date]; Xác định múi giờ mặc định được sử dụng bởi các hàm ngày; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezonedate.timezone = "Europe/Berlin"[...]

Tiếp theo tạo liên kết khởi động hệ thống cho php-fpm và khởi động nó:

systemctl enable php-fpm
systemctl restart php-fpm


PHP-FPM là một tiến trình daemon (có tập lệnh init /etc/init.d/php-fpm) chạy máy chủ FastCGI trên cổng 9000.

Để có được hỗ trợ CGI trong nginx, chúng tôi cài đặt Fcgiwrap.

Fcgiwrap là một trình bao bọc CGI cũng có thể hoạt động với các tập lệnh CGI phức tạp và có thể được sử dụng cho các môi trường lưu trữ chia sẻ vì nó cho phép mỗi máy chủ ảo sử dụng thư mục cgi-bin của riêng mình.

Vì không có gói fcgiwrap nào cho CentOS 7.0 nên chúng tôi phải tự xây dựng nó. Trước tiên, chúng ta cài đặt một số điều kiện tiên quyết:

yum -y install fcgi-devel

Bây giờ, chúng ta có thể xây dựng fcgiwrap như sau:

cd /usr/local/src/
git clone git://github.com/gnosek/fcgiwrap.git
cd fcgiwrap
autoreconf -i
./configure
make
make install

Điều này sẽ cài đặt fcgiwrap vào /usr/local/sbin/fcgiwrap.

Tiếp theo, chúng ta cài đặt gói spawn-fcgi cho phép chúng ta chạy fcgiwrap dưới dạng daemon:

yum -y install spawn-fcgi

Mở /etc/sysconfig/spawn-fcgi...

nano /etc/sysconfig/spawn-fcgi

... và sửa đổi tệp như sau:
Mã:
# Bạn phải thiết lập một số tùy chọn hoạt động trước khi dịch vụ "spawn-fcgi" hoạt động.# Nếu SOCKET trỏ đến một tệp, thì tệp này sẽ được dọn dẹp bởi tập lệnh init.## Xem spawn-fcgi(1) để biết tất cả các tùy chọn có thể.## Ví dụ:#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.socketFCGI_PROGRAM=/usr/local/sbin/fcgiwrapFCGI_USER=apacheFCGI_GROUP=apacheFCGI_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"
Bây giờ hãy thêm người dùng nginx vào nhóm apache:

usermod -a -G apache nginx

Tạo liên kết khởi động hệ thống cho spawn-fcgi...

chkconfig spawn-fcgi on

... và khởi động nó như sau:

systemctl start spawn-fcgi

Bây giờ bạn sẽ tìm thấy socket fcgiwrap trong /var/run/fcgiwrap.socket, thuộc sở hữu của người dùng và nhóm apache (một số tập lệnh, ví dụ: Mailman, mong đợi được chạy bởi người dùng/nhóm apache, đó là lý do tại sao chúng ta không chạy spawn-fcgi với tư cách là người dùng/nhóm nginx, mà thay vào đó thêm nginx vào nhóm apache).


14.1 Các phiên bản PHP bổ sung​
Bắt đầu với ISPConfig 3.0.5, có thể có nhiều phiên bản PHP trên một máy chủ (có thể chọn thông qua ISPConfig) có thể chạy thông qua FastCGI và PHP-FPM. Quy trình xây dựng các phiên bản PHP bổ sung trên CentOS được mô tả trong hướng dẫn này: Cách sử dụng nhiều phiên bản PHP (PHP-FPM & FastCGI) với ISPConfig 3 (CentOS 6.3)
 
Back
Bên trên