CentOS Web App

1. 前言

这是一篇记录了VPS使用经验的笔记.因为CentOS基本没什么更新,所以这么长时间过去了,我还是把他做了简单修改发了出来.

小站在风雨飘摇中多时,虽然时常有做备份,但也总是免不了服务器出现各种问题,系统崩溃,VPS机场不稳等等.最后还是得重新来过,本篇整理了几乎完整的安装过程和可供参考的配置文件,方便下一次从头再来.

此外,由于我曾经是忠实的红帽子和Centos用户,所以本篇中所使用的命令只保证适用于Centos7/8,原因可以参阅此文档
Supported Platform Matrix for Cadence Applications

1.1. 更新软件源与软件

更新软件,这条命令同时也会更新系统。

yum update

删除无用的包

yum autoremove

1.2. 添加额外的软件源

EPEL(Extra Packages for Enterprise Linux),是由 Fedora Special Interest Group 维护的 Enterprise Linux(RHEL,CentOS)中经常用到的包.添加EPEL源:

yum install epel-release

1.3. 更换bash为fish shell

fish shell,全称"the friendly interactive shell",如果把zsh比作Arch,那么fish shell就是Manjaro.主要是为了自动补全功能,又不想安装得太麻烦.虽然大多数人主推oh my zsh,但是个人觉得在一个运算和网络都不好的小鸡上面安太多花里胡哨的东西不值当,而且在自己的桌面Linux上也不愿意折腾,Bash已经很好用了.毕竟Fish Shell的镜像在国外.其他Linux发行版可以在官网找到更多发行版的安装方法.

对于RHEL7/Centos7.X

cd /etc/yum.repos.d/
wget https://download.opensuse.org/repositories/shells:fish:release:3/RHEL_7/shells:fish:release:3.repo
yum install fish

对于 CentOS 8

cd /etc/yum.repos.d/
wget https://download.opensuse.org/repositories/shells:fish:release:3/CentOS_8/shells:fish:release:3.repo
yum install fish

2. LNMP环境安装

LNMP安装方法多种多样,这里是手工搭建.宝塔面板和CPanel面板,一键安装脚本都可以安装,采用手动安装的方式是为了更清楚一点.

2.1. 安装NGINX

根据官网http://nginx.org/en/linux_packages.html上的方法安装NGINX包,新建nginx.repo:

vim /etc/yum.repos.d/nginx.repo

将以下内容添加进去

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

使用mainline版本(开发版本)

yum-config-manager --enable nginx-mainline #Centos7
dnf config-manager  --enable nginx-mainline #Centos8

使用Stable版本(稳定版本)

yum-config-manager --enable nginx-stable #Centos7
dnf config-manager  --enable nginx-stable #Centos8

安装NGINX

yum install nginx

2.2. 安装PHP

Remi repository 是包含最新版本 PHP 和 MySQL 包的 Linux 源,由 Remi 提供维护.使用remi安装PHP74.

yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm#Centos7
yum install http://rpms.remirepo.net/enterprise/remi-release-8.rpm#Centos8

设置PHP版本

#Centos7
yum -y install yum-utils
yum-config-manager --enable remi-php74
#Centos8
dnf module reset php
dnf module enable php:remi-7.4

安装PHP及常用组件

yum install php php-opcache php-gd php-curl php-mysqlnd php-fpm php-dom php-mbstring php-imagick php-zip php-pecl-apcu php-pecl-memcached

2.3. 配置NGINX和PHP

不同于Apache,NGINX主要作为高并发的反代服务器,本身与PHP之间使用隧道或者端口进行通信.NGINX配置比较简单,首先进行PHP的配置.

2.3.1. 配置PHP

查看PHP和NGINX版本

nginx -v
php -v

安全性问题:打开文件 /etc/php.ini,删除cgi.fix_pathinfo前面的;注释符,再赋值为0.

cgi.fix_pathinfo=0

配置php-fpm的文件权限,打开/etc/php-fpm.d/www.conf

[...]
listen.owner = nobody
listen.group = nobody
[...]
user = nginx
group = nginx
[...]

进入到/var/lib/php/将下面的路径的用户组和权限进行修改

chown nginx:nginx -R ./
chmod 775 -R ./

启动php-fpm并设置开机自启

systemctl start php-fpm
systemctl enable php-fpm

2.3.2. 配置NGINX

NGINX以效率著称,其配置文件也有其自己的独特性,参考NGINX的Full Example Configuration及其下面的配置样例,简洁高效地配置nginx的conf文件.需要注意的是一些参数的含义和继承关系.NGINX由C++开发,性能高,并且配置的模块也具备了C++的继承特性.这里不赘述NGINX的性能调优,能用就行.

打开/etc/nginx/nginx.conf,这是NGINX的总配置文件.

worker_processes设为auto,其实在单核小鸡上面设为1就够了

worker_processes  auto;

event添加epoll

events {
    worker_connections  1024;
    use epoll;
}

http模块中,添加如下配置,会与NGINX优化配置重合.

    add_header Accept-Ranges bytes; #允许断点续传
    server_tokens off; #隐藏版本号
    server_names_hash_bucket_size 64; # 配置多个虚拟主机,有多个server时需要设置散列表桶的大小
    server_names_hash_max_size 2048; # 散列表桶的最大值
    keepalive_timeout  65; #tcp链接最长时间
    client_max_body_size 1024M;#nginx报文大小限制上传文件大小限制

    #加速NGINX速度
    sendfile        on;#零拷贝
    tcp_nopush     on;
    tcp_nodelay on;

    #gzip压缩文件加快传输
    gzip  on;
    gzip_static on;
    gzip_http_version 1.1;
    gzip_comp_level 7;
    gzip_min_length 1k;
    gzip_vary on;
    gzip_buffers 4 32k;
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

    index index.php index.htm index.html;#主页文件
    include /etc/nginx/conf.d/*.conf;各个虚拟主机的配置文件

其中并没有网页服务器的模块,网页配置在server模块中,顶级配置文件通过include引用网页服务器.vim /etc/nginx/conf.d/servername.conf进行编辑.

配置样例:

server {
    listen       80;
    server_name  localhost;
    charset utf-8;
    #access_log  /var/log/nginx/host.access.log  main;
    root /usr/share/nginx/html;
    location / {
        try_files $uri $uri/ =404;
    }
    error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
   location ~ [^/]\.php(/|$) {
                fastcgi_split_path_info ^(.+?\.php)(/.*)$;
                if (!-f $document_root$fastcgi_script_name) {
                        return 404;
                }
                # Mitigate https://httpoxy.org/ vulnerabilities
                fastcgi_param HTTP_PROXY "";
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;

                # include the fastcgi_param setting
                include fastcgi_params;
                # SCRIPT_FILENAME parameter is used for PHP FPM determining
                #  the script name. If it is not set in fastcgi_params file,
                # i.e. /etc/nginx/fastcgi_params or in the parent contexts,
                # please comment off following line:
                fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    }
    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar|jpeg)$ {
            expires max;
            access_log off;
            try_files $uri =404;
    }
}

上面是使用端口转发的情况,但是在某些版本的php中,默认使用Unix sock,在NGINX中配置为

fastcgi_pass php-fpm;

检测NGINX配置文件语法

nginx -t

修改网站根目录权限,保证网站根目录下的所有应用可以访问文件夹并且运行,在安装WordPress和Nextcloud等应用时,还需要多次使用该命令

chown nginx:nginx -R ./*
chmod 775 -R ./*

启动nginx,并且设置开机自启

systemctl start nginx
systemctl enable nginx

2.3.3. 验证

在浏览器中输入你的IP,打开欢迎页面.

/usr/share/nginx/html/中新建info.php文件,检测php是否能够成功解析.vim /usr/share/nginx/html/info.php,文件内容:

<?php
        phpinfo();
?>

在浏览器中打开http://IP/info.php,可以看到PHP的相关信息.

2.4. 小结

LNMP的环境搭建告一段落,虽然没有数据库,但是已经可以支持大部分网页应用了.

2.5. 安装MariaDB及配置

在MariaDB官网https://mariadb.org/download/上安照自己的配置添加仓库.vim /etc/yum.repos.d/MariaDB.repo编辑,添加下面的对应的内容.

# MariaDB 10.5 [Stable] CentOS repository list 
# https://mariadb.org/download-test/
[mariadb]
name = MariaDB
baseurl = http://sgp1.mirrors.digitalocean.com/mariadb/yum/10.5/centos7-amd64
gpgkey=http://sgp1.mirrors.digitalocean.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1

安装MariaDB

#Cetnos7
yum install MariaDB-server MariaDB-client
#Cetnos8
dnf install MariaDB-server

第一次使用MariaDB,需要进行初始化

systemctl start mariadb
systemctl enable mariadb
mysql_secure_installation

配置如下,可以一路回车

[root@vps html]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] n
 ... skipping.

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] 
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] 
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] 
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] 
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] 
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

2.6. 最后(完成后需要做的事情)

添加站点,建议不同站点安装在不同的目录,并且修改root的位置.现代的网站需要配置ssl证书,使用certbot安装ssl证书.进入certbot官网选择web服务器和操作系统.由于前面已经安装了EPEL,所以直接安装.

yum install certbot python2-certbot-nginx#Centos7
dnf install certbot python3-certbot-nginx#Centos8

输入以下命令,根据提示输入邮箱,进行选择即可安装.

certbot --nginx

安装ssl证书后即可开启更快的HTTP/2了

listen 443 ssl http2; # managed by Certbot

3. 安装WordPress

3.1. 安装文件

从官网安装WordPress

wget https://cn.wordpress.org/latest-zh_CN.zip

解压到网站目录并且根据上面的样例设置解析.注意根目录的文件权限.

chown nginx:nginx -R ./*
chmod 775 -R ./*

在浏览器中输入域名,打开安装页面.

3.2. 准备数据库

新建WordPress数据库

CREATE DATABASE wp_db;

新建WordPress用户

CREATE USER 'wp'@'localhost' IDENTIFIED BY 'password';

为新用户授权

GRANT privileges ON databasename.tablename TO 'username'@'host';
GRANT ALL ON wp_db.* TO 'wp'@'localhost';

在安装页面中输入以上内容,并且保证WordPress目录的权限,即可完成安装.再简单进行博客的配置

3.3. 安装完成

此时更新插件,安装插件不会出现FTP问题表明文件权限没有出问题.现在wordpress的速度并不是很快,后面进行wordpress的优化

4. 安装Nextcloud

4.1. 下载文件

官网中选择server版本,解压到网站目录并且根据上面的样例设置解析.注意根目录的文件权限.

chown nginx:nginx -R ./*
chmod 775 -R ./*

在浏览器中输入域名,进入安装页面

4.2. 配置数据库

新建Nextcloud数据库

CREATE DATABASE nc_db;

新建Nextcloud用户

CREATE USER 'username'@'host' IDENTIFIED BY 'password';

为新用户授权

GRANT privileges ON databasename.tablename TO 'username'@'host';
GRANT ALL ON nc_db.* TO 'nc'@'localhost';

在安装页面中输入以上内容,并且保证Nextcloud目录的权限,即可完成安装.再简单进行网盘的配置.

将数据目录与网站目录分开,更改Data folder的路径,并且保证文件夹权限.点击完成安装进入网盘.

5. 安装h5ai

5.1. 下载文件

官网进行下载.

wget https://release.larsjung.de/h5ai/h5ai-0.29.2.zip

解压到网站目录下.

5.2. 配置h5ai

h5ai依赖NGINX和PHP,安装好PHP插件支持h5ai的全部功能

获取读写权限

chown nginx:nginx -R ./*
chmod 775 -R ./*

大部分基本的功能在前面都安装了,ffmpeg还没有安装,那就安装ffmpeg.

NUX-dextop是一个为企业级Linux提供桌面及多媒体软件包的RPM库.其包括大量的图形软件和命令行软件,包括Remmina远程桌面,VLC媒体播放器等.导入存储库GPG密钥并通过安装rpm软件包来启用Nux存储库

rpm -v --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

安装FFmpeg

yum install ffmpeg

6. V2Ray

6.1. 安装

下载安装脚本,然后运行,完成安装

curl -O https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh
bash install-release.sh

6.2. 配置

使用vmess+tls+websocket方式进行配置,注意NGINX和V2Ray的端口要一致.

7. 启用BBR PLUS等方法加速TCP速度

具体方式可以做实验尝试速度,但是频繁重启和重做系统,可能导致实例崩溃.QAQ

wget -N "https://github.000060000.xyz/tcp.sh" && chmod +x tcp.sh && ./tcp.sh

8. apf

APF(Advanced Policy Firewall)是 Rf-x Networks 出品的Linux环境下的软件防火墙,被大部分Linux服务器管理员所采用,使用iptables的规则,易于理解及使用.

8.1. 安装

官网下载下载安装包

wget https://www.rfxn.com/downloads/apf-current.tar.gz
tar xvzf apf-current.tar.gz
cd apf#按Tab自动补全
./install.sh

8.2. 配置

安装时已经检测当前监听的端口,可以根据安装时的提示配置使用的端口,编辑vim /etc/apf/conf.apf

# !!! Do not leave set to (1) !!!
# When set to enabled; 5 minute cronjob is set to stop the firewall. Set
# this off (0) when firewall is determined to be operating as desired.
DEVEL_MODE="1"
#配置完成后一定设置为0

DLIST_SPAMHAUS="1"  
DLIST_DSHIELD="1"  

开启和重启apf,apf已经放置在/etc/init.d中,开机执行.需要关闭并禁用firewalld.

systemctl stop firewalld.service#关闭需要关闭并禁用firewalld
systemctl disable firewalld.service#禁用firewalld
apf -s #开启apf
apf -r #重启apf

9. WordPress优化

9.1. 安装额外的php插件

yum install php-apcu php-bcmath php-imagick
systemctl restart php-fpm

9.2. 启用一个缓存插件

不同的插件和主题配合效果不同,这个最好多试几次,以达到最好的状态.

完成后保存设置并清空缓存

9.3. Gzip,HTTP/2

在前面的配置中,已经加入,WordPress的访问速度目前局限于图片大小,文件请求数量,渲染速度.

9.4. Site Health

评级到Good即可.

9.5. 更换图片为Webp格式

在Wordpress目录下的 /wp-includes/functions.php搜索并中加入

 'image/jpeg' => 'jpg',//搜索该行
 'image/webp' => 'webp',//加入改行
 'jpg|jpeg|jpe' => 'image/jpeg',//搜索该行
 'webp' => 'image/webp',//加入改行

在在主题的functions.php中添加:

function bzg_file_is_displayable_image($result, $path) {
$info = @getimagesize( $path );
if($info['mime'] == 'image/webp') {
$result = true;
}
return $result;
}
add_filter( 'file_is_displayable_image', 'bzg_file_is_displayable_image', 10, 2 );

由此可以解决Wordpress不能上传和预览Webp的问题

9.6. 使用CDN

CDN对于向我这种在入门级别并且远在天边的小鸡上面搭建的Wordpress站点来说尤为重要.虽然看到了很多
jsDelivr+GitHub做图床的,但是我还是只是把几张图片上传到了GitHub的仓库中https://github.com/OriPoin/Index/tree/master/img,其他图片使用OneDrive作为图床.配合 https://cdn.jsdelivr.net/gh/{用户名}/{仓库名}/ 访问图片,例如:下面这张图片的地址就是https://cdn.jsdelivr.net/gh/OriPoin/Index/img/Blog_Light.webp,可以检查元素查看链接.

[https://cdn.jsdelivr.net/gh/OriPoin/Index/img/Blog_Light.webp](https://cdn.jsdelivr.net/gh/OriPoin/Index/img/Blog_Light.webp)

10. Nextcloud优化

Nextcloud基于PHP,虽然常说C++的性能要更好一些,但是一般在设置中的概览里面全部通过即可达到合理的访问速度.可以满足日常需要了.

加入NGINX配置在http块中:

add_header Strict-Transport-Security "max-age=15768000;preload;";

10.1. 文件完整性

然后授权

chown nginx:nginx -R ./
chmod 775 -R ./

重新扫描,观察结果

10.2. 无法访问系统环境变量

编辑php-fpm的配置文件vim /etc/php-fpm.d/www.conf

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

去掉上面几行的注释,然后重启php-fpm

重新扫描,观察结果

10.3. 未能正确解析webdav

编辑网盘站点的NGINX配置文件vim /etc/nginx/conf.d/cloud.conf

location = /.well-known/carddav {
        return 301 $scheme://$host:$server_port/remote.php/dav;
}
location = /.well-known/caldav {
        return 301 $scheme://$host:$server_port/remote.php/dav;
}

重新加载NGINX

nginx -s reload

重新扫描,观察结果

10.4. 配置OPcache

编辑OPcache的配置文件vim /etc/php.d/10-opcache.ini,安照Nextcloud的建议值进行设置

opcache.enable=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

重启php-fpm

重新扫描,观察结果

10.5. 缺失的PHP模块

yum install php-intl php-gmp

重启php-fpm

重新扫描,观察结果

10.6. 配置内存缓存

官方文档在此,使用合适的方法,可以明显提速Nextcloud.之前已经安装了ACPu,所以使用ACPu.编辑vim /usr/share/nginx/html/cloud/config/config.php,加入以下内容

'memcache.local' => '\OC\Memcache\APCu',

10.7. 当然可以最后一起重启NGINX和php-fpm.

10.8. 添加定时任务

crontab -u nginx -e
*/5 * * * * php -f /usr/share/nginx/html/cloud/cron.php

11. 更多配置

不属于二者的优化,设置功能.

11.1. 设置PHP上传文件大小限制

编辑php.ini,vim /etc/php.ini

file_uploads = on ;是否允许通过HTTP上传文件的开关。默认为ON即是开
upload_tmp_dir ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
upload_max_filesize = 1024m ;望文生意,即允许上传文件大小的最大值。默认为2M
post_max_size = 8m ;指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M
max_execution_time = 600 ;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 600 ;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit = 512m ;每个PHP页面所吃掉的最大内存,默认8M

11.2. 关闭SELinux

查看SELinux状态:

/usr/sbin/sestatus -v

修改配置文件

vim /etc/selinux/config

修改下面的一行后重启机器

SELINUX=disabled

12. NGINX 优化

12.1. 将GZip更换为Brotli

Brotli的压缩性能要比Gzip好那么一些,网络上有很多博客做了测试.那就来直接更换吧.

安装必要的一些依赖,缺乏的依赖因人而异:

yum install -y pcre pcre-devel gcc openssl-devel git

进入存放源码的文件夹,下载NGINX和Brotli源码并解压

cd /usr/src
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -xzvf nginx-1.18.0.tar.gz
git clone https://github.com/google/ngx_brotli
cd ngx_brotli && git submodule update --init

使用nginx -V查看现在Nginx的编译参数然后加入Brotli的编译参数:--add-module=/usr/src/ngx_brotli

./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=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=/usr/src/ngx_brotli

使用make进行编译,根据CPU核心数目添加-j参数,因为小鸡只有一个核心所以直接make.停止NGINX服务后进行安装.

make
systemctl stop nginx.service
make install

查看是否将Brotli编译进了NGINX中:

nginx -V

添加Brotli的配置到http模块中:

    #brotli
    brotli on;
    brotli_comp_level 7;
    brotli_buffers 16 8k;
    brotli_min_length 20;
    brotli_types text/plain text/css text/javascript text/xml application/x-javascript application/xml application/x-httpd-php application/javascript application/atom+xml application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xhtml+xml font/eot font/opentype font/otf font/truetype font/ttf image/svg+xml image/x-icon image/jpeg image/gif;

13. 最后

定时备份!!

定时备份!!

定时备份!!

知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
上一篇
下一篇