iMisty的技术栈

iMisty的技术栈

wordpress部署

2019-06-19

Docker部署wordpress

1.拉取 wordpress 镜像
docker pull wordpress:latest

  1. 查看镜像
    docker images;

  2. 启动容器 docker run --name=wordpress -p 8003:22 -p 8001:80 -v /var/wordpress:/data wordpress

    *   通过8001端口访问
    
    • 本机需要php环境
    • 暂时不清楚wordpress安装数据在那个地方
    • 注意数据库路径是本机(宿主)而不是另一个容器或者当前容器的话,需要填写本机的内网ip,而不可以是localhost或者127.0.0.1
    • 可能因为nginx配置导致样式丢失

其他问题:docker 端口映射错误解决方法

docker: Error response from daemon: driver failed programming external connectivity。。。`</pre>
  • 重启docker解决 sudo systemctl restart docker

    样式无法正常显示

  • 估计是nginx配置问题,这个就不深究了

    最终使用和typecho一样使用站点的方式配置

  • 安装php环境,下载压缩包,解压到 /var/www/html这个和typecho一样就不多说了 ,需要注意的是目录目录权限问题

  • 安装配置mysql和NGINX

  • 相关配置参考typecho的配置

    贴一段NGINX的配置

   server {
            listen          80;
            server_name     www.imisty.cn imisty.cn;
            root            /var/www/html/wordpress;
            index           index.html index.htm index.php;
            client_max_body_size 100M;

            if (!-e $request_filename) {
                rewrite ^(.*)$ /index.php$1 last;
            }

            location ~ .*\.php(\/.*)*$ {
                include fastcgi.conf;
                fastcgi_index  index.php;
                fastcgi_pass  127.0.0.1:9000;

                fastcgi_connect_timeout 300;

                fastcgi_send_timeout 300;

                fastcgi_read_timeout 300;
            }

            error_log  logs/error_wordpress.log;
            access_log logs/misty.log combined;
        }

常见问题解决方案

  • 英文包转换成中文环境,在站点根目录找到wp-config.php,将define('WPLANG', '');改为define('WPLANG', 'zh_CN');没有则添加即可,然后刷新控制台面板出现更新直接下载中文包即可
  • 下载包需要验证ftp,编辑wp-config.php如下即可,官方建议升级完成之后修改回来
define('WPLANG', 'zh_CN');
 define("FS_METHOD", "direct");
 define("FS_CHMOD_DIR", 0777);
 define("FS_CHMOD_FILE", 0777);
  • 解决“在裁剪您的图像时发生了错误” php-gd或者相关扩展没有安装吧,官方论坛搜索即可

打开域名访问主页变成下载index.php页面的源代码,其他路径的页面可以正常访问或者访问域名跳转到127.0.0.1

出现这个问题,就有点懵了,毕竟NGINX的配置没有怎么改,之前都是好好地,但是配置文件更换频繁导致的,浏览器客户端不解析php,回家访问一次发现解决了这个问题怀疑是浏览器缓存导致的,浏览器记住了之前的配置不会解析php成html

解决方案:这个是因为浏览器缓存的原因导致的,清除浏览器缓存即可    

连续刷新页面出现502 错误,php-cgi程序崩溃了

照抄网上的解决方案

  • 查看当前的PHP FastCGI进程数是否够用,如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大

    netstat -anpo | grep "php-cgi" | wc -l

  • 部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:

    
    {
    
    ......
    
    fastcgi_connect_timeout 300;
    
    fastcgi_send_timeout 300;
    
    fastcgi_read_timeout 300;
    
    ......
    
    }
    
  • php.ini中memory_limit设低了会出错,修改了php.ini的memory_limit为64M,重启nginx,发现好了,原来是PHP的内存不足了

    这样多次刷新依然出现502错误

Nginx错误日志

    recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 183.54.41.123, server: www.imisty.cn, request: "GET /index.php?rest_route=/yoast/v1/statistics HTTP/1.1", upstream: "fastcgi://127.0.0.1:8001", host: "imisty.cn", referrer: "http://imisty.cn/wp-admin/"
### 用`php-fpm`服务进行管理,解决多次刷新页面502的问题
  • yum install php70w-fpm 安装,因为之前安装过旧版本,存在冲突,这里需要指定版本

  • service php-fpm restart 启动php-fpm服务

    lsof查看php-cgi端口kill掉;php-fpm默认的端口是9000

    上传的文件尺寸超过php.ini中定义的upload_max_filesize值。

  • 修改/etc/php.ini中的属性值即可

    Jetpack导致页面卡慢

    事实证明,再好的东西,不合适就是不合适,再说这个插件实际使用也没多好,反正页面卡慢,严重影响速度和心态

    解决Linux下php-fpm进程过多导致内存耗尽问题

    感谢这位小伙伴提供的资料
    最近发现博客打开经常出现数据库无法连接并且在网络正常的情况下出现的连接卡慢的问题;刚开始以为是之前的redis漏洞导致的挖矿程序入侵

    但是free -h查看之后发现不是CPU占用问题而是内存占用过多导致的,平均每一个fpm进程占用了2%内存
    查看内存消耗最多的 40个进程 ps auxw|head -1;ps auxw|sort -rn -k4|head -40
    img

    查看第四列内存使用占比,发现除了mysql数据库服务之外,php-fpm服务池开启了太多子进程,占用超过大半内存,问题找到了,我们开始解决问题:设置控制php-fpm进程池进程数量

    解决方案:
    通过各种搜索手段,发现可以通过配置 pm.max_children 属性,控制php-fpm子进程数量,首先,打开php-fpm配置文件,执行指令:

    vi /etc/php-fpm.d/www.conf
    找到 pm.max_children字段,发现其值过大:

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

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

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

    pm.start_servers 创建就直接启动的进程数量,不可以小于pm.min_spare_servers

    service php-fpm status查看服务状态发现配置错误

`[pool www] pm.min_spare_servers(5) and pm.max_spar...en(25) ` 开始的时候 `max_children`设置为25 ,`max_spare_servers`设置为35 发现服务无法启动
最后,重启php-fpm

`systemctl restart php-fpm` 或者`service   php-fpm  restart`
再次查看内存使用情况, 使用内存降低很多:
![img](https://img.imisty.cn/upload_images/img_free1.png)

其他相关设置

ps:查看php-fpm开启的进程数以及每个进程的内存限制
  1. 通过命令查看服务器上一共开了多少的 php-cgi 进程
    ps -fe |grep "php-fpm"|grep "pool"|wc -l

  2. 查看已经有多少个php-cgi进程用来处理tcp请求
    netstat -anp|grep "php-fpm"|grep "tcp"|grep "pool"|wc -l

  3. linux+nginx+php环境中,每个php-fpm进程的内存限制

    设置方法:

    编辑php-fpm.conf配置文件

    php_admin_value[memory_limit] = 128M(我服务器上的配置文件在/etc/php5/fpm/pool.d/www.conf这个文件是被包含在php-fpm.conf里的) 后边的数字可以随便更改:32M,64M,128M,256M,512M,这个设置可根据你的服务器内存大小和你的需求来写,修改后要加载一下php-fpm服务。

    查看错误日志

    打开 $wordpress/wp-config.php 开启如下配置,就可以查看日志了,但是注意解决问题之后需要关闭debug模式

    ini_set('log_errors','On');
     ini_set('display_errors','On');
     ini_set('error_reporting', E_ALL );
    define('WP_DEBUG', false);
     define('WP_DEBUG_LOG', true);
     define('WP_DEBUG_DISPLAY', true);
    

    有一部分主题显示错误

    部分主题出现未知错误打开文章出错,于是开启debug调试查看问题所在,L-Talk直接前端查看问题就行了因为是jquery资源是http的不是https的导致页面一致处于加载状态无法显示,更换一个jquery的cdn地址即可解决这个问题,Simple主题也是直接安装处于维护状态的问题,文章列表无法正常显示,但是可以通过网址直接访问,估计也是数据库问题,mdx主题无法正常显示文章,数据库方面报错,但是可以显示文章列表

    1. 打开php debug模式

2. 加载页面,如下输出


    Warning: mysqli_real_connect(): The server requested authentication method unknown to the client [caching_sha2_password] in /deploy/wordpress/wp-includes/wp-db.php on line 1612

    Warning: mysqli_real_connect(): (HY000/2054): The server requested authentication method unknown to the client in /deploy/wordpress/wp-includes/wp-db.php on line 1612
    The server requested authentication method unknown to the client

3. 刚开始以为是MySQL驱动问题,一阵鼓捣,执行如下代码

```bash
这里带上版本是为了防止冲突
yum remove php70w-mysql
yum install php70w-mysqlnd
重新启动服务
service php-fpm restart`</pre>
```
  1. 修改 数据库验证方式为 caching_sha2_password 依然出错并且进不去后台了,数据库死或连接不上去,最后还是换回mysql_native_password ,还原问题出现如下错误

  2. 仔细观察关键日志,发现mb_strimwidth错误 ,百度了一下,发现是缺少了一个插件yum install php70w-mbstring ,重新安装插件之后重启fpm 成功解决了这个问题,发现不是数据库的问题,虽然,数据库的版本比较低,但是不会影响

    Fatal error: Uncaught Error: Call to undefined function mb_strimwidth() in /var/www/html/wordpress/wp-content/themes/yeziting/modules/loop.php:40 Stack trace: #0 /var/www/html/wordpress/wp-includes/template.php(724): require() #1 /var/www/html/wordpress/wp-includes/template.php(671): load_template('/var/www/html/w...', false) #2 /var/www/html/wordpress/wp-includes/general-template.php(168): locate_template(Array, true, false) #3 /var/www/html/wordpress/wp-content/themes/yeziting/loop-collapsed.php(4): get_template_part('modules/loop') #4 /var/www/html/wordpress/wp-includes/template.php(724): require('/var/www/html/w...') #5 /var/www/html/wordpress/wp-includes/template.php(671): load_template('/var/www/html/w...', false) #6 /var/www/html/wordpress/wp-includes/general-template.php(168): locate_template(Array, true, false) #7 /var/www/html/wordpress/wp-content/themes/yeziting/index.php(2): get_template_part('loop-collapsed') #8 /var/www/html/wordpress/wp-includes/template-loader.php(78): include('/var/www/html/w...') #9 /var in /var/www/html/wordpress/wp-content/themes/yeziting/modules/loop.php on line 40