CentOS 6 32位 Nginx+PHP7+MySQL 建站环境配置

虽然我已经建站多年了,但是用 VPS 自己搭环境的时间还不长。在这里记录下我最近搭建环境的全过程,敬请各位指正批评。

这篇文章展示了我从一个全新安装的 CentOS 6 32位操作系统,进行系统精简,设置 SSH 证书登录,更新 OpenSSL,编译安装 Nginx、PHP 7、MySQL 等程序,进行一点优化配置,设置数据库定时备份的全过程。搭建的网站环境支持一些前沿的东西,如 HTTP/2。

这个过程主要是面向网站搬家的新环境配置,如果是全新搭建网站,也只需省去其中几步。CentOS 7 或 64 位系统的话也可以参考列出的来源资料,做些变通。

请新手注意,我这里默认你们已经会使用 putty 之类的终端连接 Linux 服务器,并且看得懂一些基本的命令了。其实我也比新手好不到哪里去。我的 SSH 终端用的是 Firefox 扩展 FireSSH,SFTP 客户端使用的是 FireFTP。之所以还用个 SFTP 客户端,是因为我仍然不会用 vi 之类的文本编辑器……

进入正题!以下操作均以 root 身份登录进行:

查看系统信息

首先,我比较喜欢看一下系统信息。如果不是我熟悉的系统,我就会重装。

执行以下命令查看系统版本:

cat /etc/issue

查看系统是 32 位的还是 64 位的:

getconf LONG_BIT

查看系统的资源使用情况,主要看看内存使用情况:

top

这个要使用 Ctrl+Z 终止。使用 q 结束。

精简和优化 CentOS

删除不必要的自带软件包:

yum remove Deployment_Guide-en-US finger cups-libs cups ypbind
yum remove bluez-libs desktop-file-utils ppp rp-pppoe wireless-tools irda-utils
yum remove sendmail* samba* talk-server finger-server bind* xinetd
yum remove nfs-utils nfs-utils-lib rdate fetchmail eject ksh mkbootdisk mtools
yum remove syslinux tcsh startup-notification talk apmd rmt dump setserial portmap yp-tools
yum groupremove "Mail Server" "Games and Entertainment" "X Window System" "X Software Development"
yum groupremove "Development Libraries" "Dialup Networking Support"
yum groupremove "Games and Entertainment" "Sound and Video" "Graphics" "Editors"
yum groupremove "Text-based Internet" "GNOME Desktop Environment" "GNOME Software Development"

执行以下代码查看 seLinux 状态:

sestatus

如果显示 disabled 就说明 seLinux 是禁用状态。如果不是禁用状态,则需要禁用 seLinux。禁用 seLinux 的方法是,编辑 /etc/selinux/config 文件,写上 SELINUX=disabled(而不是 SELINUX=enforcing)。

禁用 seLinux 也是为了减少资源使用。seLinux 这个东西争议比较大,可以去网上找找资料看。

初始化防火墙:

touch /etc/sysconfig/iptables
iptables -F
iptables -X
iptables -Z
service iptables save
service iptables restart

禁用无用服务(可以做成脚本执行):

#! /bin/bash
service acpid off
service atd stop
service auditd stop
service avahi-daemon stop
service avahi-dnsconfd stop
service bluetooth stop
service conman stop
service cpuspeed stop
service cups stop
service dnsmasq stop
service dund stop
service firstboot stop
service hidd stop
service httpd stop
service ibmasm stop
service ip6tables stop
service irda stop
service kdump stop
service lm_sensors stop
service mcstrans stop
service messagebus stop
service microcode_ctl stop
service netconsole stop
service netfs stop
service netplugd stop
service nfs stop
service nfslock stop
service nscd stop
service ntpd stop
service oddjobd stop
service pand stop
service pcscd stop
service portmap stop
service psacct stop
service rdisc stop
service restorecond stop
service rpcgssd stop
service rpcidmapd stop
service rpcsvcgssd stop
service saslauthd stop
service sendmail stop
service setroubleshoot stop
service smb stop
service vncserver stop
service winbind stop
service wpa_supplicant stop
service xfs stop
service ypbind stop
service yum-updatesd stop
chkconfig acpid off
chkconfig atd off
chkconfig auditd off
chkconfig avahi-daemon off
chkconfig avahi-dnsconfd off
chkconfig bluetooth off
chkconfig conman off
chkconfig cpuspeed off
chkconfig cups off
chkconfig dnsmasq off
chkconfig dund off
chkconfig firstboot off
chkconfig hidd off
chkconfig httpd off
chkconfig ibmasm off
chkconfig ip6tables off
chkconfig irda off
chkconfig kdump off
chkconfig lm_sensors off
chkconfig mcstrans off
chkconfig messagebus off
chkconfig microcode_ctl off
chkconfig netconsole off
chkconfig netfs off
chkconfig netplugd off
chkconfig nfs off
chkconfig nfslock off
chkconfig nscd off
chkconfig ntpd off
chkconfig oddjobd off
chkconfig pand off
chkconfig pcscd off
chkconfig portmap off
chkconfig psacct off
chkconfig rdisc off
chkconfig restorecond off
chkconfig rpcgssd off
chkconfig rpcidmapd off
chkconfig rpcsvcgssd off
chkconfig saslauthd off
chkconfig sendmail off
chkconfig setroubleshoot off
chkconfig smb off
chkconfig vncserver off
chkconfig winbind off
chkconfig wpa_supplicant off
chkconfig xfs off
chkconfig ypbind off
chkconfig yum-updatesd off

我觉得 Apache 可以卸载掉:

yum remove httpd

还有 sendmail 也不需要,到时候发邮件用 SMTP:

yum remove sendmail

升级一下系统和其他软件:

yum upgrade

清除刚刚造成的缓存:

yum clean all

这个时候可以再看一下资源占用情况:

top

这一节的方法来源于老左博客

更改系统时区

执行以下命令将时区改为东八区(北京时间):

rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

查看当前时间:

date

设置 SSH 证书登录

默认登录认证是密码认证,使用证书认证能提高安全性。

参考《配置 SSH 服务以使用证书登录 Linux 服务器》。需要生成一对高强度的公私钥,可以使用 Windows 下的 PuTTYgen。私钥留在自己电脑中保存。公钥放在服务器上,修改/etc/ssh/sshd_config 文件,写上公钥的路径。再做一些增强安全性的措施,比如禁止密码登录,但是千万注意要先测试成功证书登录才行。

这一步稍微有点麻烦,不会做可以先不做,以免登录不上服务器。

升级 OpenSSL

系统软件包的 OpenSSL 过旧,既不太安全,也缺乏一些新的特性。我想要支持 HTTP/2 这样的东西,旧版本的 OpenSSL 可能不会支持 ALPN。因此有必要升级 OpenSSL。

官网上找到最新版本号。截止发文时最新版本号为 1.1.0c,就以此为例。

分别执行下列命令:

mkdir /usr/local/openssl
cd /usr/local/src
wget https://www.openssl.org/source/openssl-1.1.0c.tar.gz
tar xzf openssl-1.1.0c.tar.gz
cd openssl-1.1.0c
./config --prefix=/usr/local/openssl/
make && make install
mv /usr/bin/openssl /usr/bin/openssl.bak
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

这样,应该就安装好最新版的 OpenSSL 了。来查看一下版本:

openssl version -a

这个编译安装的过程引用自 Linux 技术之家,原出处不可访问。

如果查看版本时提示“openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory”错误,就执行下列命令:

ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so.1.1

以后升级 OpenSSL 时,适当地重做本小节步骤即可。“适当”的意思是该下载的还是要下载,该编译的还是要编译,但是创建目录这样的就不用重复做了。或许升级完 OpenSSL 还会想重新编译安装 Nginx。

安装 PHP 7

同样地,PHP 7 还算比较前沿。系统自带软件包的 PHP 可能没有 7 版本的。还好,这里有一篇文章提供了不错的选择:《如何在CentOS / RHEL 7.1和6.7安装PHP 7,NGINX与MySQL 5.6》。只需引入几个 yum 库。

不过我操作的时候,发现还需要安装另一个库(注意,这是 32 位的):

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

接着按照文章所说的来准备:

rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
rpm -Uvh http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm

下面的命令是真正来安装 PHP 7 的:

yum install php70w

安装 PHP 7 完成后,可以列出可安装的模块:

yum search php70w

然后来安装一些模块:

yum install php70w-mysql php70w-xml php70w-soap php70w-xmlrpc
yum install php70w-mbstring php70w-json php70w-gd php70w-mcrypt

其实我们想要的“PHP 7”还没安装完,后面再继续。

安装 Nginx

为什么需要手动编译安装 Nginx?又是同样的道理。

首先安装一些依赖:

yum -y install gcc gcc-c++ autoconf automake make libtool
yum -y install epel-release
yum -y install zlib zlib-devel
yum -y install pcre pcre-devel
yum -y install libxslt-devel gd-devel GeoIP-devel

下载一个 pcre,待会儿编译 Nginx 要用到。这里不用编译 pcre。命令如下:

mkdir -p /root/nginx-source/pcre
cd /root/nginx-source/pcre
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.39.tar.gz
tar -zxvf pcre-8.39.tar.gz

Nginx 官网上找到最新版的版本号。截止发文时最新版本号为 1.11.8,就以此为例,OpenSSL 的版本以上文的 1.1.0c 为例。下面真正编译安装 Nginx 了:

cd /usr/local/src
wget http://nginx.org/download/nginx-1.11.8.tar.gz
tar xzf nginx-1.11.8.tar.gz
cd /usr/local/src/nginx-1.11.8
mkdir /usr/local/nginx
groupadd www 
useradd nginx -g www -s /sbin/nologin -M
mkdir /var/cache/nginx/
mkdir /var/cache/nginx/client_temp && mkdir /var/cache/nginx/uwsgi_temp && mkdir /var/cache/nginx/scgi_temp
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=www --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-http_v2_module  --with-openssl=/usr/local/src/openssl-1.1.0c --with-pcre=/root/nginx-source/pcre/pcre-8.39 
make && make install

这一节的内容系我根据 Linux 技术之家MikeMiao 的文章整合修改的。据说还要设置环境变量什么的,但是我不会搞,好像也没什么问题。

可以查看 Nginx 版本了:

nginx -V

如果日后要升级,也是适当重做本节步骤即可。依赖不必重新安装,要注意参数中 OpenSSL 的目录。

安装 MySQL

前面在 PHP 7 安装的时候,已经为这步做好铺垫了。现在只需执行:

yum install mysql-server

然后 MySQL 就安装好了。

现在启动它的服务:

service mysqld start

进行一次 mysql_secure_installation(首先会提示设置 root 账号的密码,然后问几个问题,一般都填 Y):

mysql_secure_installation

再重启一下服务:

service mysqld restart

MySQL 就安装好了,后续会进行重要的配置。

一些 VPS 可能不支持这样安装,在启动服务时会报错,像这样:

/usr/bin/mysqld_safe: line 178: 18240 Killed nohup /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock < /dev/null > /dev/null 2>&1
MySQL Daemon failed to start.

如果不幸是这样,我也没有解决的办法。可以自己去网上找找看,或者另找旧版 MySQL 去安装。

安装 PHP-FPM

前面在“安装 PHP 7”一节说“其实我们想要的‘PHP 7’还没安装完”,其实是说还需要个 PHP-FPM。

执行:

yum install php70w-fpm

启动服务:

service php-fpm start

如果自己改了防火墙设置,要保证开放 Web 的 80 和 443 端口。

将网站内容传上去

将网站的文件全部上传过去,注意文件夹和文件的权限。

嗯,这句话是给网站搬家准备的。全新建站就无视吧。

生成一个 dhparam.pem:

openssl dhparam -out /var/www/cert/dhparam.pem 4096

配置 Nginx 和 php.ini

按照上面所说的安装 Nginx 后,其配置文件是 /etc/nginx/nginx.conf。编辑它。

看到前几行,有一行这个:

worker_processes 1;

去掉最开头那个注释符,并修改后面的数值,一般来说 CPU 有几核心就修改为几。

新建目录 /etc/nginx/conf.d/,用于存放站点 Nginx 配置文件。还是编辑刚才那个文件,在 http{} 块中添加:

include /etc/nginx/conf.d/*.conf;

为了在输出网站时隐去 Nginx 的版本号,增强安全性,再在 http{} 块中添加:

server_tokens off;

可以试试让 Nginx 读取修改后的配置:

nginx -c /etc/nginx/nginx.conf

配置需要重新加载才生效:

nginx -s reload

要隐去 PHP 版本号,编辑 /etc/php.ini,搜索 expose_php,将值改为 Off,即这一行改为:

expose_php = Off

重启 php-fpm 看看是不是正常:

service php-fpm restart 

于是就来添加开机启动了。编辑 /etc/rc.d/rc.local 文件,添加下面两行:

service php-fpm start
nginx -c /etc/nginx/nginx.conf

配置 MySQL

安装 MySQL 后,内存占用会急剧增加。编辑 /etc/my.cnf 文件,适当添加以下代码:

[mysqld]
performance_schema_max_table_instances=200
table_definition_cache=200
table_open_cache=128

相关参数的具体数值自己相关资料,去修改。

为了后面的数据库备份,这里顺便添加一下数据库的用户名和密码:

[mysqldump]
user=用户名
password=密码

在这里写上用户名密码,是为了避免在命令行或脚本文件中写出。

恢复数据库

到这里就可以恢复数据库的内容了。

因为我的网站是用的程序 Typecho,我还会重新保存一下插件的设置。

这节也是给网站搬家用的。

设置数据库自动备份

数据无价,一定要经常备份。经常变动的就是数据库了,所以最好能每天自动备份数据库。这里使用 SMTP 发信,将数据库导出为文件,作为附件发送过去。

安装 mutt 和 msmtp:

yum install mutt
yum install msmtp

编辑 /etc/Muttrc.local 填写发信人信息:

\# Local configuration for Mutt.
set from = "邮箱地址"
set realname = "发件人名称"
set use_from = yes
set sendmail="/usr/bin/msmtp"
set editor="vi"
unset record

创建 ~/.msmtprc~/.msmtp.log,分别为配置文件和日志文件,这里的“~/”表示用户目录。我在这里一直用 root,所以就是“/root/”。编辑配置文件 /root/.msmtprc,这里以 Gmail 为例:

account gmail
host smtp.gmail.com
from 邮箱地址
auth on
port 587
tls on
tls_starttls on
tls_trust_file /etc/pki/tls/certs/ca-bundle.crt
user 用户名
password 密码
account default : gmail
logfile ~/.msmtp.log

创建一个用于存放备份的临时文件的目录,就执行这个命令吧:

mkdir /root/backups/

将下面的内容保存为 /root/automysqlbackup.sh

mysqldump 表1 > /root/backups/表1.sql
mysqldump 表2 > /root/backups/表2.sql
tar zcvf /root/backups/database.tar.gz /root/backups/表1.sql /root/backups/表2.sql
echo "这是程序自动生成的备份 / MySQL 数据库备份 / \`date +%F\` \`date +%T\`" |mutt -s "\`date +%Y%m%d\`-s-数据库备份文件" 收件人地址 -a /root/backups/database.tar.gz
rm -rf /root/backups/表1.sql /root/backups/表2.sql /root/backups/database.tar.gz

除了表1、表2的名称,注意还要把“收件人地址”换成自己的。另外设置 automysqlbackup.sh 的权限,让其可以被执行。

可以执行一下看是否工作正常:

sudo /root/automysqlbackup.sh

正常的话,最后利用 crontab 添加定时任务(如果没有这个东西则需自己安装),修改 /var/spool/cron/root,添加一行:

00 02 * sudo /root/automysqlbackup.sh

这节内容也算进阶内容,不详细展开了。相关邮件组件的问题排查,可以自己网上搜索。另外,这节部分内容系从网上引用,但是来源丢失了,知道的烦请告诉一下。

完成

这个时候我喜欢重启一下:

shutdown -r now

部分 VPS 用命令重启有问题,那就去服务商的面板那里点 reboot 吧。

最终,环境就配置好了。在以后的升级中,除了 OpenSSL 和 Nginx 需要手动下载新版编译安装外,其余的会随 yum update 自动更新。

这一系列操作是我亲测后整理出来的,供大家参考。

2016-12-31 P.S.修改了文章标题,原题为“CentOS 6 32位配置 Nginx+PHP7+MySQL 建站环境全过程”。重启前先执行 sync 命令,让内存缓冲数据写入到硬盘去,否则容易造成数据丢失。也可用 shutdown -r now 替代 reboot 式的重启。top 不是一定要使用 Ctrl+Z 终止,用 q 就可以退出。nginx -s reload 是重新加载配置文件,不是重启。(感谢 KLLSo

若无特别说明,本文系原创,遵循 署名-非商业性使用 3.0 (CC BY-NC 3.0) 协议,转载文章请注明来自【闪星空间】,或链接上原文地址:http://shansing.com/read/449/

15 条评论

  1. 我一直用的lamp,centos。
    五六年前刚开始做vps配置的时候用过lnmp,但是发现在服务器压力大于设计压力的情况下,几乎80%以上会超时,用户体验很不好,而且是无法避免的,之后就一直是lamp了。

    如果vps只是给自己博客用或者给非常非常小的负载来用无所谓,如果是做一些动态数据很多的网站尽可能的不要用nginx。

    1. 确实,Nginx 用于静态网站更好些。
      吓得我赶紧装了 Tengine。

      1. 我去~~~
        淘宝居然自己搞了这么个玩意?
        你算是给我科普了~

    2. lnmp的性能瓶颈在于nginx代理后端php时采用fastcgi方式,这中方式对高并发支持的确不好。apache使用mod_php处理并发要比fastcgi好一些,但是占用资源也多。nginx在低并发,低资源的工况下表现更好。

      1. 其实这从根本上就是错误的了,对于一台服务器而言最重要的就是线路稳定,系统稳定。
        如果只是超出了系统本身带载能力,而不是DDOS之类的情况,就会导致504之类的无法工作,这不能符合一个web服务器的标准。
        nginx不是低并发,低资源下更好,而是说nginx和apache在相同配置的服务器上,前者能带100最多,超过100就504,后者能带70,超过70低于300就会较慢到很慢。
        因此在设计工况下,nginx的带载能力更好,所以超小型网站和超大型网站都喜欢nginx,前者是因为vps可以买的非常非常小,128内存都能跑了,后者是因为这样能减小服务器的成本开支,而不上不下的最喜欢apache,因为他们也不知道自己到底突发流量会有多大。

        由于nginx有太多硬性缺陷,所以出现了很多演绎版本,比如lanmp之类的,还有淘宝二次开发的tengine。
        目前新版本apache的资源占用率也不是很高了,而且老牌就是老牌,无论是插件还是各种模块,程序,支持度都要好很多。

        总结就是,
        慢和打不开是截然不同的两种用户体验,千万不要因为快一点就忽略了打不开的必死硬伤。

        1. nginx是一个反向代理服务器,和apache工作方式有本质区别,504的问题不在于nginx,而是php-fpm,nginx收到请求后会把请求抛到后端的php-fpm,当并发增加php-fpm线程池满了,php-fpm不能响应请求了,nginx就504了。
          大的web应用,比如淘宝入口使用nginx原因是人家后端是java的,nginx除了要把请求代理给后端servlet引擎之外,他还有负载均衡的任务,这才是nginx的真正用途。如果后端是java,入口web服务器nginx基本上是不二之选。
          其实讨论nginx和apache谁更优没有意义,两者的定位完全不同。
          就php程序而言,现在比较折中的架构是lnmpa,使用nginx处理静态内容,php请求抛到apache,apache再使用mod_php解析php,这样理论上是效率最高的,但前提是,服务器内存要大。

          1. 我们说的其实并无冲突,我一直强调的就是对于动态网站来说,用nginx很容易出现504,无论是什么原因造成的。
            对于小vps来说,容易504,对于大服务器来说,也是用lnamp之类的演绎方案。
            任何成熟方案都不会让nginx处理非静态数据。
            所以只要是动态站,稳妥方案仍是apache。

            而LLMP,LNAMP之类的方案并不适合放个blog之类的小站,nginx的优势就是处理静态内容,但是对于小blog之类的根本用不上,还不如单apache。

  2. 另外,邮箱通知不错,点个赞

    1. 谢谢。我默默地观看你们的精彩发言。

      1. 我们邮箱通知模板居然是一样的。。。

        1. 公版模具

          1. 我七年前用它的时候还不是公版。。。。。。。。

  3. Nicky Nicky

    军哥的LNMP就好了。http://www.zrblog.net/6581.html赵容的备份php+ crontab感觉足够了。。。

    1. 如果用一键脚本肯定是可以的啊,没话说。这篇只是给想手动配置的人看的。当然其实以现在的角度看,文章很多东西都不是很完善了。

      1. Nicky Nicky

        是的。各种代码太麻烦,军哥的脚本还可以直接把 Let's Encrypt 定期更新装上去。。。

发表评论»

NO SPAMS! 不要发垃圾评论哦!

表情