前景

现在越来越多的服务对 linux 的包容性更好一些。而 windows 相对来说安全性、性能等都赶不上 linux。当前我去使用 linux 作为服务器操作系统已经是必然之选。CentOS 一直是作为主要的 linux 服务器的首选。所以这次,我直接把阿里云上的实例换了。



操作

今天将网站进行了整体迁移。主要的一些操作如下:

  • 备份原网站。
    • 由于我的这个网站的内容非常的少,所以直接使用的 wordpress 自带的博客导出功能。导出为一个 xml 文件。
  • 由原来的 Windows 服务器改为 CentOS 服务器。
    • 直接在阿里云停止服务器,然后更改实例,选择 CentOS。
  • 由 IIS 向 Nginx 迁移。
    • 在 CentOS 中使用命令 yum install nginx -y 即可安装 nginx。
  • 由 http 向 https 迁移。
    • 在腾讯云SLL证书中,申请一个免费的证书
    • 上传至服务器的目录。我上传到了 /etc/nginx/ssl 中
    • 在配置中配置对应的证书,代码见下方配置处。

迁移过程中产生了一些问题。例如:

  • 如何在 CentOS 中安装 php7
  • 如何使用 Nginx php
  • 如何使用 Nginx https
  • 如何使 wordpress 拥有文件夹操作权限
    • 需要在 /etc/php-fpm.d/www.conf 中查看当前使用的 user 是谁
    • 然后更改 wordpress 根目录在权限
      • 命令为:sudo chown -R nginx:nginx ./

Nginx 的主要操作如下:

  • 在文件夹 /etc/nginx/conf.d/ 下新增配置文件 www.taliove.com.conf,具体内容见下方
  • 使用命令 systemctl restart nginx 重启 Nginx 服务。

upstream php {
        server unix:/tmp/php-cgi.socket;
        server 127.0.0.1:9000;
}
server {
        listen 443 ssl;
        server_name taliove.com;

        ssl on;
        ssl_certificate /etc/nginx/ssl/1_taliove.com_bundle.crt;
        ssl_certificate_key /etc/nginx/ssl/2_taliove.com.key;

        root /usr/local/www/www.taliove.com;
        index index.php;
        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }
        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                include fastcgi.conf;
                fastcgi_intercept_errors on;
                fastcgi_pass php;
                fastcgi_buffers 16 16k;
                fastcgi_buffer_size 32k;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }

        error_page 404 /404.php;
        error_page 500 502 503 504 /50x.php;
}
server {
        server_name www.taliove.com;
        return 301 https://taliove.com$request_uri;
}
server {
        server_name taliove.com;
        return 301 https://taliove.com$request_uri;
}

Nginx 优化

观察发现,每个页面加载耗时非常的长。基本上在4~5秒左右。一般网站的耗时在1秒左右是较好的。超过了就难以接受。在www.taliove.com.conf配置中开启gzip的支持:

 gzip             on;
 gzip_min_length  1k;
 gzip_comp_level  6;
 gzip_proxied     expired no-cache no-store private auth;
 gzip_types       text/plain application/x-javascript text/css application/xml application/javascript application/json;
 gzip_vary on;
 gzip_disable "MSIE [1-6]\.";
 location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ {
         access_log   off;
         expires      30d;
 }
 
 location ~* ^.+\.(css|js|txt|xml|swf|wav)$ {
        access_log   off;
        expires      24h;
 }
 
 location ~* ^.+\.(html|htm)$ {
        expires      2h;
 }
 
 location ~* ^.+\.(eot|ttf|otf|woff|svg)$ {
        access_log   off;
        expires max;
 }

开启后发现,文章加载耗时降至1.3秒左右。首页也在这个时间范围。排查问题,发现字体消耗是的时间是较多的。接下来主要优化一下字体、图片的加载,其实也就是静态资源的加载,以及数据加载的问题。之后会引入 CDN。这样静态资源加载时间会更快一些。但是数据加载这里,暂时内存不太够用,不然也可以引入使用内存缓存机制。

php-fpm 优化

优化进程数

经过几天的观察,发现服务器的内存经常爆满。通过命令top查看占用情况,发现CPU的占用并不高。但php-fpm占用的大量的内存。查阅了一些资源,针对php做出如下优化。

修改文件/etc/php-fpm.d/www.conf的如下设置处:

pm.max_children = 25
pm.max_spare_servers = 20

pm.max_children值为50,每一个进程占用1%-2.5%的内存,加起来就耗费大半内存了,所以我们需要将其值调小,博主这里将其设置为25,同时,检查以下两个属性:

  1. pm.max_spare_servers: 该值表示保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
  2. pm.min_spare_servers: 保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程;

这两个值均不能不能大于pm.max_children值,通常设置pm.max_spare_servers值为pm.max_children值的60%-80%。

最后,重启php-fpm:

systemctl restart php-fpm

参考文章:http://blog.codingplayboy.com/2017/11/30/linux_php-fpm_memory_problem/

优化MariaDB

修改/etc/my.conf.d/server.cnf

[mysqld]
slow_query_log = ON
slow_query_log_file = /var/log/mariadb/slow.log
long_query_time = 0.1
# 此处关闭了域名反查,所以连接 wordpress 时,使用 localhost 等计算机名
skip-name-resolve= 1
query_cache_type = 1
query_cache_limit = 256K
query_cache_min_res_unit = 2k
query_cache_size = 80M
tmp_table_size= 64M
max_heap_table_size= 64M
// 修改完成后,执行命令 systemctl restart mariadb 重启数据库

参考文章:
https://linux.cn/article-5730-1.html

优化wordpress性能

Redis缓存的添加,以减少数据库查询的次数。实验证明,启用缓存后,数据库查询从20多降至个位数。

//安装 redis 与 php 的 redis 插件
yum install redis php-redis
//设置 redis 最大使用内存,由于本机只有 1G 内存,所以设置小一点
vim /etc/redis.conf
//将以下值改为 200M
maxmemory 209715200
//启动redis服务
systemctl start redis
//wordpress 安装 redis 插件
//重启php
systemctl restart php-fpm
//在 wp-config.php 处新增 redis 配置
define('WP_REDIS_CLIENT', 'pecl');
define('WP_REDIS_SCHEME', 'tcp');
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_DATABASE', '0');
define('WP_CACHE_KEY_SALT', 'wp_');
define('WP_REDIS_MAXTTL', '432000');
//然后在 wordpress 后台管理处启用该 插件

启用Opcache

在php7中启用Opcache可以极大的增强性能。实验证明,启用后,数据库查询由原来的200多毫秒降至十位数级。

yum install php-opcache
systemctl restart php-fpm

Swap

交换空间的配置

由于使用的是阿里云最低配置的主机。内存只有1G。一会儿就使用完了。特别是使用 mysql 后,基本上数据库以后 Out of memory 后,内存就只剩下几十兆了。所以我们需要分配一下交换空间。

使用swapon命令可以检查系统是否已经配置过swap,这是一个通用的swap工具。使用-s标签可列出当前存储设备上的swap使用情况:

swapon -s

我们也可以使用 free -m 来查看剩余内存。其中会有交互空间的显示。接下来快速执行如下一系列操作即可:

//开始之前,我们先检查一下磁盘空间:
df -h
//创建交换空间:
sudo fallocate -l 4G /swapfile
//检查空间大小:
ls -lh /swapfile
//启用文件,确保只有root用户可读:
sudo chmod 600 /swapfile
//用以下命令告知系统该文件作为交换空间使用:
sudo mkswap /swapfile
//告知系统使用该文件作为交换空间:
sudo swapon /swapfile
//使用该交换空间永久生效,编辑文件etc/fstab
sudo vim /etc/fstab
//在该文件末尾添加如下代码:
/swapfile   swap    swap    sw  0   0

参考文章:https://blog.csdn.net/zstack_org/article/details/53258588

结尾

这些问题也都一一解决。最终效果还是不错的。使用 CentOS + Nginx + https增强整体网站的性能与安全性。

所有的访问都会重定向至 https://taliove.com ,这样的链接看起来更简洁一些。