升级

一直在使用 LNMP一键安装包,就没有重复造轮子折腾手动安装和升级了;这几天通过其脚本顺利地升级了生产环境的 nginxphpphpmyadmin。跟着军哥的官方升级文档大概率是可以成功的(话说我好久之前有失败过),不怕,即使失败了也可以及时恢复~

Nginx 1.14.2   →  Nginx 1.18.0
PHP 7.2        →  PHP 7.3.21
phpMyAdmin 4.9 →  phpMyAdmin 5.0.2

记录如下:

Nginx

# 访问 http://nginx.org/en/download.html 查找nginx的版本号
# 推荐使用stable版本
# 输入版本号1.18.0
cd ~/lnmp1.7 && ./upgrade.sh nginx

假如升级失败,这样来恢复原NGINX

将脚本备份的 /usr/local/nginx/sbin/nginx.日期 文件重命名为 nginx

接着重启 lnmp nginx reload 即可恢复~

PHP

# 访问 http://www.php.net/downloads.php 查找版本号
# 推荐使用中间版本
# 输入版本号7.3.21
cd ~/lnmp1.7 && ./upgrade.sh php

升级后,配置文件 php.iniphp-fpm.conf 会被覆盖!一般里边都有针对自己服务器设置的自定义参数,记得改回来~

# PHP 配置文件位置:
/usr/local/php/etc/php.ini
# php-fpm 配置文件位置:
/usr/local/php/etc/php-fpm.conf

假如升级失败,这样来恢复原PHP

  • 首先将脚本备份的目录名为/usr/local/oldphp日期 重命名为php
  • 接着把/usr/local/oldphp日期/init.d.php-fpm.bak.日期 的文件拷贝到/etc/init.d/ 目录下并且重命名为php-fpm
  • 最后重启:lnmp php-fpm reload 即可恢复~

如果访问网站还是 502 的话,试试 /etc/init.d/php-fpm restart ~

phpMyAdmin

# 访问 https://www.phpmyadmin.net/downloads/ 查找版本号
# 输入版本号:5.0.2
cd ~/lnmp1.7 && ./upgrade.sh phpmyadmin

优化

前面记录的基础配置优化:

这里再记录下后面学习 Get 到的其他内容,以防好记性又掉链子了~

php.ini

# 修改 php 配置文件
vim /usr/local/php/etc/php.ini

opcache

2020/12/13 更新记录,切记如果有使用过 LNMP 一键安装包自带的脚本开启过 opcache 的话(即运行过 cd ~/lnmp1.7 && ./addons.sh install opcache),请务必不要再在 php.ini 修改有关 opcache 的配置!不然会冲突,出现 php-fpm segfault 报错,导致网站奔溃访问不了!

参考资料:让PHP7达到最高性能的几个Tipsopcache详解、还有这里~

点击查看相关修改(慎用!)

[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16

; 运行 “find . -type f -print | grep php | wc -l”
; 这个命令来快速计算你的代码库中的PHP文件数、
; 最终设置一个大于它的值填在下面:
opcache.max_accelerated_files=10000

opcache.file_cache=/tmp

; 相关教程:https://www.laruence.com/2015/10/02/3069.html
; 1.先运行 “cat /proc/meminfo | grep Huge”
; 2.再在系统中开启HugePages
;   以CentOS为例先运行命令 “sudo sysctl vm.nr_hugepages=512”
;   目的是分配512个预留的大页内存;
; 3.再取消注释如下所示:
opcache.huge_code_pages=1

Avada

WP主题 Avada 对 VPS 服务器还是有点要求的,特别是在导入 demo 数据时;而且在主题状态页面会提示系统环境问题(红色提示),我们只需要把提示的项目修改为它要求的值即可:

点击查看相关修改

# 解决 PHP Time Limit 问题
# 把默认的 30 改为 300 或 要求的值
max_execution_time = 300

# 解决 PHP Max Input Vars 问题
# 把默认的 30 改为 3000 或 要求的值
max_input_vars = 4180

# 解决 PHP Memory Limit 问题
# 0.扩展 WordPress 内存使用
# 1.把默认值 改为 VPS内存的1/4 或 要求的值;
memory_limit = 512M
# 2.在php.ini修改好内存限制,保存配置之后需要重启php;
# 3.必须再修改WP网站根目录下的 wp-config.php 文件:
#   加入这行代码 “ define('WP_MEMORY_LIMIT', '512M'); ”

# WordPress 无法切换主题;
# 原因是lnmp一键安装包的 php.ini 默认禁止了 scandir 函数;
解决方法:在 “disable_functions = …” 中把 scandir 删除掉。

以上配置都需要重启 lnmp php-fpm reload 才能生效。

这里留个位置给以后的内容~

php-fpm.conf

更新:一般 LNMP一键安装包都自动配置好了适配当前服务器配置的进程数量,功力不足请勿修改该配置文件!我发现改完参数后 iowait 很不正常,改回来默认参数就稳了...

PHP-FPM(FastCGI Process Manager)FastCGI进程管理器,是由PHP实现的,用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。支持的功能如:平滑停止/启动的高级进程管理功能、慢日志记录脚本、动态/静态子进程产生。

点击查看参考资料

PHP-FPM之前,它有两个祖先:

  • CGI(Common Gateway Interface)通用网关接口,是一种让交互程序与Web服务器通信的协议。它负责处理URL的请求,启动一个进程,将客户端发送的数据作为输入,由Web服务器收集程序的输出并加上合适的头部,再发送回客户端。
  • FastCGI(Fast Common Gateway Interface)快速通用网关接口,是早期通用网关接口(CGI)的增强版本,致力于减少网页服务器与CGI程序之间交互的开销,从而使服务器可以同时处理更多的网页请求。不同于创建新的进程来服务请求,使用持续的进程和创建的子进程来处理一连串的进程,这些进程由FastCGI服务器管理,开销更小,效率更高。

以下是干货来源,这样做以及为什么(看看了解下即可,慎用!):

1.参考PHP-FPM 调优:使用 pm static 来最大化你的服务器负载能力,我决定为 8GB 服务器从 dynanic 改为 static 的方式来控制子进程的数量;

2.参考这里关于进程数调优的方法可以大致计算出适合自己服务器配置的子进程数量:

  • 每一个子进程同时只能服务一次连接,所以控制同时存在多少个进程数就很重要,如果过少会导致很多不必要的重建和销毁的开销,如果过多又会占用过多的内存,影响其他服务使用。
  • 我们应该测试自己的PHP进程使用多少内存,一般来说刚启动时是8M左右,运行一段时间由于内存泄漏和缓存会上涨到30M左右,所以你需要根据自己的预期内存大小设定进程的数量。同时根据进程池的数量来看一个进程管理器的子进程数量限制:
# 引用自原文的方法
# 查看目前的子进程数量
ps auxf | grep php | grep -v grep
# 总共被子进程们占用的内存(KB)
ps auxf | grep php | grep -v grep | grep -v master | awk '{sum+=$6} END {print sum}'
# 所有的子进程数量
ps auxf | grep php | grep -v grep | grep -v master | wc -l

有了上面的两个返回的值,我们就可以算出平均每个 PHP 子进程占用的内存;再用能够分配的内存除以它得到一个合适的子进程数量值。

3.还有这个PHP优化案例值得一看。

# 修改 php-fpm.conf 配置文件
vim /usr/local/php/etc/php-fpm.conf

点击查看相关修改(以4GB内存为例)

[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice

[www]
listen = /tmp/php-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = static
pm.max_children = 50      # 允许最大的子进程数
pm.start_servers = 10     # 启动的进程数
pm.min_spare_servers = 10 # 最小空闲进程数(动态模式生效)
pm.max_spare_servers = 20 # 最大空闲进程数(动态模式生效)
pm.max_requests = 1024    # 处理完多少个请求,重新启动进程
pm.process_idle_timeout = 10s   # 空闲的进程达到多久时间被杀掉(ondemand) 
request_terminate_timeout = 100 # 将执行时间太长的进程直接终止
request_slowlog_timeout = 5s    # 执行超过3s的脚本都会被写入慢日志
slowlog = /home/wwwlogs/php_slow.log # 慢日志存储位置

以上配置也是需要重启 lnmp php-fpm reload 才能生效。

Nginx

花了好几天在网上搜索了关于配置 Nginx 的资料!最后在不想再折腾的时候看到了这么一篇汇总文章:Nginx 从入门到实践,万字详解!,耐着性子看完觉得挺全面的~

nginx.conf

# LNMP一键安装脚本的Nginx主配置(默认虚拟主机)文件
vim /usr/local/nginx/conf/nginx.conf

我在主配置文件上做了一些备注说明

注意:以下大部分参数都是原版(即LNMP一键安装脚本成功安装后的原文件),我只在 worker_cpu_affinityworker_rlimit_nofileworker_connectionsgzip_comp_levellocation ~ .*\.(ico|jpg|jpeg|gif|png|webp|bmp|woff)$下做了基于自己服务器配置的自定义修改:

# 配置进程所属用户和用户组
user  www www;

# 配置进程数量,为避免cpu切换损耗,配置和系统内核数一样即可
# 用命令 grep processor /proc/cpuinfo | wc -l 查询填写该值即可
# 或者填写 auto 自动查询
worker_processes auto;

# 配置 CPU 亲和力(auto 代表自动绑定)
worker_cpu_affinity auto;

# 日志位置
error_log  /home/wwwlogs/nginx_error.log  crit;

# 进程位置
pid        /usr/local/nginx/logs/nginx.pid;

# 配置 所有进程加起来 的最大打开文件数(此值应小于 系统最大打开文件数 ulimit -n 命令查询)
worker_rlimit_nofile 800000;

events
    {
        use epoll;                 # 用这个模型来高效处理异步事件
        worker_connections 200000; # 单个工作进程可以允许同时建立外部连接的数量(所有进程最大打开文件数 除以 进程数量)
        multi_accept off;          # 进程是否同时接受连接所有新请求(默认为off表示一次只接受一个新的请求,官方推荐 off)
        accept_mutex off;          # 设置为 on 表示 worker 进程轮流接受新链接(官方推荐设置为 off,高负载的情况下设置为 on)
    }

http
    {
        include       mime.types;
        default_type  application/octet-stream;

        server_names_hash_bucket_size 128;
        client_header_buffer_size 32k;
        large_client_header_buffers 4 32k;
        client_max_body_size 50m;

        sendfile on;
        sendfile_max_chunk 512k;
        tcp_nopush on;

        keepalive_timeout 60; # 为了尽快释放连接,可以设置小点,15 至 30
        tcp_nodelay on; # 该选项仅在连接转换到 keep-alive ,长连接状态时启用,让 tcp 尽快发包

        fastcgi_connect_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 64k;
        fastcgi_buffers 4 64k;
        fastcgi_busy_buffers_size 128k;
        fastcgi_temp_file_write_size 256k;

        gzip on;                # 开启gzip压缩功能
        gzip_min_length  1k;    # 设置允许被压缩的页面最小字节数
        gzip_buffers     4 32k;
        gzip_http_version 1.1;
        gzip_comp_level 4;      # 设置压缩级别1-9,数字越大压缩效果越好,压缩时间也就越长CPU越高
        gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss;
        gzip_vary on;           # vary header支持。该选项可以让前端的缓存服务器缓存经过gzip压缩的页面
        gzip_proxied   expired no-cache no-store private auth;
        gzip_disable   "MSIE [1-6]\.";

        server_tokens off; # 隐藏响应头中的有关操作系统和web server(Nginx)版本号的信息,这样对于安全性是有好处的
        access_log off;    # 关闭日志

# LNMP一键安装包在 该NGINX主配置文件 只配置了以下这么一个默认虚拟主机
# 所有其他虚拟主机都有独立的配置文件,需要自己再独立设置相应的参数!!!
server
    {
        listen 80 default_server reuseport;
        server_name _;
        index index.html index.htm index.php;
        root  /home/wwwroot/default;

        #error_page   404   /404.html;

        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        include enable-php.conf;

        location /nginx_status
        {
            stub_status on;
            access_log  off;
        }

        # 设置 网站图标、图片、字体 为最长的缓存时间
        location ~ .*\.(ico|jpg|jpeg|gif|png|webp|bmp|woff)$
        {
            access_log off;
            log_not_found off;
            add_header Pragma public;
            add_header Cache-Control "public";
            expires max;
        }

        location ~ .*\.(js|css)?$
        {
            expires      10d;
        }

        location ~ /.well-known {
            allow all;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log  /home/wwwlogs/access.log;
    }
include vhost/*.conf;
}

domain.conf

为方便管理,在主配置文件的最后有这么一句:include vhost/*.conf;

  • server下关于虚拟机的配置都独立出来,所谓的 Nginx 副配置文件;
  • 通过脚本命令lnmp vhost add 新添加的所有虚拟机以域名命名.conf 都会被存放在该路径下:/usr/local/nginx/conf/vhost
  • 以后哪个网站需要改动配置,就可以直接去那个虚拟机配置文件 修改,不用去动主配置文件了。

我在副配置文件上做了一些备注说明

以下大部分参数都是原版(即 lnmp vhost add添加虚拟机后的原文件),我只添加了 重定向,以及修改了 图片缓存参数

server
    {
        # 监听80端口
        listen 80;
  
        # 设置虚拟主机的域名
        server_name shenguanqun.com www.shenguanqun.com;
  
        # 重定向 www.shenguanqun.com 到 shenguanqun.com
        if ($host = 'www.shenguanqun.com' ) {
        return 301 https://shenguanqun.com$request_uri;   
        }

        # 设置虚拟主机的根目录
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/shenguanqun.com;

        # 设置伪静态 Typecho
        include rewrite/typecho.conf;
  
        # 设置 404 页面(默认被注释掉了,需要可以开启)
        #error_page   404   /404.html;

        # 禁止访问指定目录下的PHP文件(默认被注释掉了,需要可以开启)
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        include enable-php-pathinfo.conf;

        # 设置网站的图标、图片、字体 为最长的缓存时间
        location ~ .*\.(ico|jpg|jpeg|gif|png|webp|bmp|woff)$
        {
            access_log off;
            log_not_found off;
            add_header Pragma public;
            add_header Cache-Control "public";
            expires max;
        }

        # 设置经常改动的 js css 为差不多的缓存时间
        location ~ .*\.(js|css)?$
        {
            expires      30d;
        }

        location ~ /.well-known {
            allow all;
        }

        location ~ /\.
        {
            deny all;
        }

        # 关闭网站日志
        access_log off;

    }

# 安装SSL后,脚本会新增以下配置;除了SSL证书,其他的跟上边http版本的配置一摸一样
server
    {
        listen 443 ssl http2;
        #listen [::]:443 ssl http2;
        server_name shenguanqun.com www.shenguanqun.com;
        # 重定向 www.shenguanqun.com 到 shenguanqun.com
        if ($host = 'www.shenguanqun.com' ) {
        return 301 https://shenguanqun.com$request_uri;   
        }
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/shenguanqun.com;

        ssl_certificate /usr/local/nginx/conf/ssl/shenguanqun.com/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/conf/ssl/shenguanqun.com/shenguanqun.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;
        # openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
        ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;

        include rewrite/typecho.conf;
        #error_page   404   /404.html;

        # Deny access to PHP files in specific directory
        #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

        include enable-php-pathinfo.conf;

        location ~ .*\.(ico|jpg|jpeg|gif|png|webp|bmp|woff)$
        {
            access_log off;
            log_not_found off;
            add_header Pragma public;
            add_header Cache-Control "public";
            expires max;
        }

        location ~ .*\.(js|css)?$
        {
            expires      30d;
        }

        location ~ /.well-known {
            allow all;
        }

        location ~ /\.
        {
            deny all;
        }

        access_log off;
    }

常用配置

不同的网站有不同的需求,每个虚拟机配置文件都不尽相同;这里记录一些经常需要用到的配置/功能,以后拿来改改就能用~

1.一个重定向搞定:HTTP到HTTPS + 301跳转

  • 大势所趋:HTTP 跳转到HTTPS
  • 经常需要:带www 跳转到不带www(或者不带www 跳转到www

对于 前面只添加单域名在虚拟机配置文件 这种情况,在将以下添加到虚拟机配置文件之前,注意/确保/操作:

  1. 带www不带www 这两个域名都有做DNS解析到同个服务器IP;
  2. 运行lnmp ssl add 将两个域名填写进去配置步骤里,再次一起获取SSL证书
  3. 一般命令行会提示这个错误:[warn] conflicting server name "shenguanqun.com" on 0.0.0.0:443, ignored,把虚拟机配置文件里的旧的SSL配置(在中间!)删掉即可,只保留底下新增的SSL配置;
  4. 最后添加以下配置到相应位置,检查下nginx -t,再重启lnmp nginx reload 即可。
# 将以下规则添加到虚拟主机名下面那行即可
# 注意:务必添加两次,一次在端口80下,另一次在端口443下
# 以下示例也就是本站在使用的:
# 将 www.shenguanqun.com 重定向301跳转到 shenguanqun.com
# 你只需要调换下网址即可实现带不带www
server_name shenguanqun.com www.shenguanqun.com;
if ($host = 'www.shenguanqun.com' ) {
   return 301 https://shenguanqun.com$request_uri;   
}

未完待续~

Last modification:January 9, 2021
如果觉得我的文章对你有用,请随意赞赏