wordpress IP验证不当漏洞修复

wordpress /wp-includes/http.php文件中的wp_http_validate_url函数对输入IP验证不当,导致黑客可构造类似于012.10.10.10这样的畸形IP绕过验证,进行SSRF。

解决方案:

在网站目录中找到这个wp-includes/http.php文件,编辑http.php

查找

$same_host = strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] );

替换成

if ( isset( $parsed_home['host'] ) ) { $same_host = ( strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] ) || 'localhost' === strtolower( $parsed_url['host'] ) ); } else { $same_host = false; };

查找

if ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0]

改成

if ( 127 === $parts[0] || 10 === $parts[0] || 0 === $parts[0] || 0 === $parts[0]

最后保存退出即可修复

修改 Nginx 服务器 WordPress 上传文件大小限制

默认情况下 WordPress 上传文件限制为 2M,如果有上传较大文件的需要,我们需要将上传文件的大小上限调大。

修改 PHP 配置文件

编辑 PHP 配置文件 php.ini ,查找以下字段:

$ sudo vi /etc/php.ini

post_max_size=8M 
upload_max_filesize=2M 

其中,post_max_size 参数表示 POST 数据所允许的最大大小,一般要设置的比upload_max_filesize大;upload_max_filesize 参数表示默认上传文件大小。

将其改为自己需要的值,例如:

post_max_size=80M
upload_max_filesize=50M

修改 Nginx 配置文件

修改当前网站的 Nginx 配置文件,这个文件一般在 /etc/nginx/conf.d 目录下,后缀名为 .conf,在 http{} 字段中添加以下内容:

client_max_body_size 50M;

完成上述修改后,重启 PHP 与 Nginx 使修改生效:

sudo service nginx restart
sudo service php-fpm restart

完成后 WordPress 上传文件的大小限制就变成 50M 了!

在Kubernetes上运行高可用的WordPress和MySQL

WordPress是用于编辑和发布Web内容的主流平台。在本教程中,我将逐步介绍如何使用Kubernetes来构建高可用性(HA)WordPress部署。

WordPress由两个主要组件组成:WordPress PHP服务器和用于存储用户信息、帖子和网站数据的数据库。我们需要让整个应用程序中这两个组件在高可用的同时都具备容错能力。

在硬件和地址发生变化的时候,运行高可用服务可能会很困难:非常难维护。借助Kubernetes以及其强大的网络组件,我们可以部署高可用的WordPress站点和MySQL数据库,而无需(几乎无需)输入单个IP地址。

在本教程中,我将向你展示如何在Kubernetes中创建存储类、服务、配置映射和集合,如何运行高可用MySQL,以及如何将高可用WordPress集群挂载到数据库服务上。如果你还没有Kubernetes集群,你可以在Amazon、Google或者Azure上轻松找到并且启动它们,或者在任意的服务器上使用Rancher Kubernetes Engine (RKE)

架构概述

现在我来简要介绍一下我们将要使用的技术及其功能:
WordPress应用程序文件的存储:具有GCE持久性磁盘备份的NFS存储
数据库集群:带有用于奇偶校验的xtrabackup的MySQL
应用程序级别:挂载到NFS存储的WordPress DockerHub映像
负载均衡和网络:基于Kubernetes的负载均衡器和服务网络

该体系架构如下所示:

未分类

在K8s中创建存储类、服务和配置映射

在Kubernetes中,状态集提供了一种定义pod初始化顺序的方法。我们将使用一个有状态的MySQL集合,因为它能确保我们的数据节点有足够的时间在启动时复制先前pods中的记录。我们配置这个状态集的方式可以让MySQL主机在其他附属机器之前先启动,因此当我们扩展时,可以直接从主机将克隆发送到附属机器上。

首先,我们需要创建一个持久卷存储类和配置映射,以根据需要应用主从配置。我们使用持久卷,避免数据库中的数据受限于集群中任何特定的pods。这种方式可以避免数据库在MySQL主机pod丢失的情况下丢失数据,当主机pod丢失时,它可以重新连接到带xtrabackup的附属机器,并将数据从附属机器拷贝到主机中。MySQL的复制负责主机-附属的复制,而xtrabackup负责附属-主机的复制。

要动态分配持久卷,我们使用GCE持久磁盘创建存储类。不过,Kubernetes提供了各种持久性卷的存储方案:

# storage-class.yamlkind: StorageClassapiVersion: storage.k8s.io/v1metadata:
 name: slowprovisioner: kubernetes.io/gce-pdparameters:
 type: pd-standard  zone: us-central1-a

创建类,并且使用指令:$ kubectl create -f storage-class.yaml部署它。

接下来,我们将创建configmap,它指定了一些在MySQL配置文件中设置的变量。这些不同的配置由pod本身选择有关,但它们也为我们提供了一种便捷的方式来管理潜在的配置变量。

创建名为mysql-configmap.yaml的YAML文件来处理配置,如下:

# mysql-configmap.yamlapiVersion: v1kind: ConfigMapmetadata:
 name: mysql  labels:
   app: mysqldata:
 master.cnf: |    # Apply this config only on the master.
   [mysqld]
   log-bin
   skip-host-cache
   skip-name-resolve  slave.cnf: |    # Apply this config only on slaves.
   [mysqld]
   skip-host-cache
   skip-name-resolve

创建configmap并使用指令:$ kubectl create -f mysql-configmap.yaml
来部署它。

接下来我们要设置服务以便MySQL pods可以互相通信,并且我们的WordPress pod可以使用mysql-services.yaml与MySQL通信。这也为MySQL服务启动了服务负载均衡器。

# mysql-services.yaml# Headless service for stable DNS entries of StatefulSet members.apiVersion: v1kind: Servicemetadata:
 name: mysql  labels:
   app: mysqlspec:
 ports:
 - name: mysql    port: 3306  clusterIP: None  selector:
   app: mysql

通过此服务声明,我们就为实现一个多写入、多读取的MySQL实例集群奠定了基础。这种配置是必要的,每个WordPress实例都可能写入数据库,所以每个节点都必须准备好读写。

执行命令 $ kubectl create -f mysql-services.yaml来创建上述的服务。

到这为止,我们创建了卷声明存储类,它将持久磁盘交给所有请求它们的容器,我们配置了configmap,在MySQL配置文件中设置了一些变量,并且我们配置了一个网络层服务,负责对MySQL服务器请求的负载均衡。上面说的这些只是准备有状态集的框架, MySQL服务器实际在哪里运行,我们接下来将继续探讨。

配置有状态集的MySQL

本节中,我们将编写一个YAML配置文件应用于使用了状态集的MySQL实例。

我们先定义我们的状态集:

1、创建三个pods并将它们注册到MySQL服务上。
2、按照下列模版定义每个pod:

  • 为主机MySQL服务器创建初始化容器,命名为init-mysql.
  • 给这个容器使用mysql:5.7镜像
  • 运行一个bash脚本来启动xtrabackup
  • 为配置文件和configmap挂载两个新卷

3、为主机MySQL服务器创建初始化容器,命名为clone-mysql.

  • 为该容器使用Google Cloud Registry的xtrabackup:1.0镜像
  • 运行bash脚本来克隆上一个同级的现有xtrabackups
  • 为数据和配置文件挂在两个新卷
  • 该容器有效地托管克隆的数据,便于新的附属容器可以获取它

4、为附属MySQL服务器创建基本容器

  • 创建一个MySQL附属容器,配置它连接到MySQL主机
  • 创建附属xtrabackup容器,配置它连接到xtrabackup主机

5、创建一个卷声明模板来描述每个卷,每个卷是一个10GB的持久磁盘
下面的配置文件定义了MySQL集群的主节点和附属节点的行为,提供了运行附属客户端的bash配置,并确保在克隆之前主节点能够正常运行。附属节点和主节点分别获得他们自己的10GB卷,这是他们在我们之前定义的持久卷存储类中请求的。

apiVersion: apps/v1beta1kind: StatefulSetmetadata:
 name: mysqlspec:
 selector:
   matchLabels:
     app: mysql  serviceName: mysql  replicas: 3  template:
   metadata:
     labels:
       app: mysql    spec:
     initContainers:
     - name: init-mysql        image: mysql:5.7        command:
       - bash        - "-c"
       - |
         set -ex          # Generate mysql server-id from pod ordinal index.
         [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
         ordinal=${BASH_REMATCH[1]}
         echo [mysqld] > /mnt/conf.d/server-id.cnf          # Add an offset to avoid reserved server-id=0 value.
         echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf          # Copy appropriate conf.d files from config-map to emptyDir.
         if [[ $ordinal -eq 0 ]]; then
           cp /mnt/config-map/master.cnf /mnt/conf.d/
         else
           cp /mnt/config-map/slave.cnf /mnt/conf.d/
         fi        volumeMounts:
       - name: conf          mountPath: /mnt/conf.d        - name: config-map          mountPath: /mnt/config-map      - name: clone-mysql        image: gcr.io/google-samples/xtrabackup:1.0        command:
       - bash        - "-c"
       - |
         set -ex          # Skip the clone if data already exists.
         [[ -d /var/lib/mysql/mysql ]] && exit 0          # Skip the clone on master (ordinal index 0).
         [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
         ordinal=${BASH_REMATCH[1]}
         [[ $ordinal -eq 0 ]] && exit 0          # Clone data from previous peer.
         ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql          # Prepare the backup.
         xtrabackup --prepare --target-dir=/var/lib/mysql        volumeMounts:
       - name: data          mountPath: /var/lib/mysql          subPath: mysql        - name: conf          mountPath: /etc/mysql/conf.d      containers:
     - name: mysql        image: mysql:5.7        env:
       - name: MYSQL_ALLOW_EMPTY_PASSWORD          value: "1"
       ports:
       - name: mysql          containerPort: 3306        volumeMounts:
       - name: data          mountPath: /var/lib/mysql          subPath: mysql        - name: conf          mountPath: /etc/mysql/conf.d        resources:
         requests:
           cpu: 500m            memory: 1Gi        livenessProbe:
         exec:
           command: ["mysqladmin", "ping"]
         initialDelaySeconds: 30          periodSeconds: 10          timeoutSeconds: 5        readinessProbe:
         exec:
           # Check we can execute queries over TCP (skip-networking is off).
           command: ["mysql", "-h", "127.0.0.1", "-e", "SELECT 1"]
         initialDelaySeconds: 5          periodSeconds: 2          timeoutSeconds: 1      - name: xtrabackup        image: gcr.io/google-samples/xtrabackup:1.0        ports:
       - name: xtrabackup          containerPort: 3307        command:
       - bash        - "-c"
       - |
         set -ex
         cd /var/lib/mysql          # Determine binlog position of cloned data, if any.
         if [[ -f xtrabackup_slave_info ]]; then            # XtraBackup already generated a partial "CHANGE MASTER TO" query
           # because we're cloning from an existing slave.
           mv xtrabackup_slave_info change_master_to.sql.in            # Ignore xtrabackup_binlog_info in this case (it's useless).
           rm -f xtrabackup_binlog_info
         elif [[ -f xtrabackup_binlog_info ]]; then            # We're cloning directly from master. Parse binlog position.
           [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1
           rm xtrabackup_binlog_info
           echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',                  MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.in
         fi          # Check if we need to complete a clone by starting replication.
         if [[ -f change_master_to.sql.in ]]; then
           echo "Waiting for mysqld to be ready (accepting connections)"
           until mysql -h 127.0.0.1 -e "SELECT 1"; do sleep 1; done

           echo "Initializing replication from clone position"
           # In case of container restart, attempt this at-most-once.
           mv change_master_to.sql.in change_master_to.sql.orig
           mysql -h 127.0.0.1 <<EOF
         $(<change_master_to.sql.orig),
           MASTER_HOST='mysql-0.mysql',
           MASTER_USER='root',
           MASTER_PASSWORD='',
           MASTER_CONNECT_RETRY=10;
         START SLAVE;
         EOF
         fi          # Start a server to send backups when requested by peers.
         exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c             "xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root"
       volumeMounts:
       - name: data          mountPath: /var/lib/mysql          subPath: mysql
       - name: conf          mountPath: /etc/mysql/conf.d        resources:
         requests:
           cpu: 100m            memory: 100Mi      volumes:
     - name: conf        emptyDir: {}
     - name: config-map        configMap:
         name: mysql  volumeClaimTemplates:
 - metadata:
     name: data    spec:
     accessModes: ["ReadWriteOnce"]
     resources:
       requests:
         storage: 10Gi

将该文件存为mysql-statefulset.yaml,输入kubectl=”” create=”” -f=”” mysql-statefulset.yaml并让kubernetes部署你的数据库。
现在当你调用$=”” kubectl=”” get=”” pods,你应该看到3个pods启动或者准备好,其中每个pod上都有两个容器。主节点pod表示为mysql-0,而附属的pods为mysql-1和mysql-2.让pods执行几分钟来确保xtrabackup服务在pod之间正确同步,然后进行wordpress的部署。
您可以检查单个容器的日志来确认没有错误消息抛出。 查看日志的命令为$=”” logs=”” <container_name=””>

主节点xtrabackup容器应显示来自附属的两个连接,并且日志中不应该出现任何错误。

部署高可用的WordPress

整个过程的最后一步是将我们的WordPress pods部署到集群上。为此我们希望为WordPress的服务和部署进行定义。

为了让WordPress实现高可用,我们希望每个容器运行时都是完全可替换的,这意味着我们可以终止一个,启动另一个而不需要对数据或服务可用性进行修改。我们也希望能够容忍至少一个容器的失误,有一个冗余的容器负责处理slack。

WordPress将重要的站点相关数据存储在应用程序目录/var/www/html中。对于要为同一站点提供服务的两个WordPress实例,该文件夹必须包含相同的数据。

当运行高可用WordPress时,我们需要在实例之间共享/var/www/html文件夹,因此我们定义一个NGS服务作为这些卷的挂载点。
下面是设置NFS服务的配置,我提供了纯英文的版本:

# nfs.yaml# Define the persistent volume claimapiVersion: v1kind: PersistentVolumeClaimmetadata:
name: nfs  labels:
  demo: nfs  annotations:
  volume.alpha.kubernetes.io/storage-class: anyspec:
accessModes: [ "ReadWriteOnce" ]
resources:
  requests:
    storage: 200Gi---# Define the Replication ControllerapiVersion: v1kind: ReplicationControllermetadata:
name: nfs-serverspec:
replicas: 1  selector:
  role: nfs-server  template:
  metadata:
    labels:
      role: nfs-server    spec:
    containers:
    - name: nfs-server        image: gcr.io/google_containers/volume-nfs:0.8        ports:
        - name: nfs            containerPort: 2049          - name: mountd            containerPort: 20048          - name: rpcbind            containerPort: 111        securityContext:
        privileged: true        volumeMounts:
        - mountPath: /exports            name: nfs-pvc      volumes:
      - name: nfs-pvc          persistentVolumeClaim:
          claimName: nfs---# Define the Servicekind: ServiceapiVersion: v1metadata:
name: nfs-serverspec:
ports:
  - name: nfs      port: 2049    - name: mountd      port: 20048    - name: rpcbind      port: 111  selector:
  role: nfs-server

使用指令$ kubectl create -f nfs.yaml部署NFS服务。现在,我们需要运行$ kubectl describe services nfs-server获得IP地址,这在后面会用到。

注意:将来,我们可以使用服务名称讲这些绑定在一起,但现在你需要对IP地址进行硬编码。

# wordpress.yamlapiVersion: v1kind: Servicemetadata:
 name: wordpress  labels:
   app: wordpressspec:
 ports:
   - port: 80  selector:
   app: wordpress    tier: frontend  type: LoadBalancer---apiVersion: v1kind: PersistentVolumemetadata:
 name: nfsspec:
 capacity:
   storage: 20G  accessModes:
   - ReadWriteMany  nfs:
   # FIXME: use the right IP
   server: <ip of="" the="" nfs="" service="">    path: "/"---apiVersion: v1kind: PersistentVolumeClaimmetadata:
 name: nfsspec:
 accessModes:
   - ReadWriteMany  storageClassName: ""
 resources:
   requests:
     storage: 20G---apiVersion: apps/v1beta1 # for versions before 1.8.0 use apps/v1beta1kind: Deploymentmetadata:
 name: wordpress  labels:
   app: wordpressspec:
 selector:
   matchLabels:
     app: wordpress      tier: frontend  strategy:
   type: Recreate  template:
   metadata:
     labels:
       app: wordpress        tier: frontend    spec:
     containers:
     - image: wordpress:4.9-apache        name: wordpress        env:
       - name: WORDPRESS_DB_HOST          value: mysql        - name: WORDPRESS_DB_PASSWORD          value: ""
       ports:
       - containerPort: 80          name: wordpress        volumeMounts:
       - name: wordpress-persistent-storage          mountPath: /var/www/html      volumes:
     - name: wordpress-persistent-storage        persistentVolumeClaim:
           claimName: nfs

我们现在创建了一个持久卷声明,和我们之前创建的NFS服务建立映射,然后将卷附加到WordPress pod上,即/var/www/html根目录,这也是WordPress安装的地方。这里保留了集群中WordPress pods的所有安装和环境。有了这些配置,我们就可以对任何WordPress节点进行启动和拆除,而数据能够留下来。因为NFS服务需要不断使用物理卷,该卷将保留下来,并且不会被回收或错误分配。

使用指令$ kubectl create -f wordpress.yaml部署WordPress实例。默认部署只会运行一个WordPress实例,可以使用指令$ kubectl scale –replicas= deployment/wordpress扩展WordPress实例数量。

要获得WordPress服务负载均衡器的地址,你需要输入$ kubectl get services wordpress
并从结果中获取EXTERNAL-IP字段来导航到WordPress。

弹性测试

OK,现在我们已经部署好了服务,那我们来拆除一下它们,看看我们的高可用架构如何处理这些混乱。在这种部署方式中,唯一剩下的单点故障就是NFS服务(原因总结在文末结论中)。你应该能够测试其他任何的服务来了解应用程序是如何响应的。现在我已经启动了WordPress服务的三个副本,以及MySQL服务中的一个主两个附属节点。

首先,我们先kill掉其他而只留下一个WordPress节点,来看看应用如何响应:$ kubectl scale –replicas=1 deployment/wordpress现在我们应该看到WordPress部署的pod数量有所下降。$ kubectl get pods应该能看到WordPress pods的运行变成了1/1。

点击WordPress服务IP,我们将看到与之前一样的站点和数据库。如果要扩展复原,可以使用$ kubectl scale –replicas=3 deployment/wordpress再一次,我们可以看到数据包留在了三个实例中。

下面测试MySQL的状态集,我们使用指令缩小备份的数量:$ kubectl scale statefulsets mysql –replicas=1我们会看到两个附属从该实例中丢失,如果主节点在此时丢失,它所保存的数据将保存在GCE持久磁盘上。不过就必须手动从磁盘恢复数据。

如果所有三个MySQL节点都关闭了,当新节点出现时就无法复制。但是,如果一个主节点发生故障,一个新的主节点就会自动启动,并且通过xtrabackup重新配置来自附属节点的数据。因此,在运行生产数据库时,我不建议以小于3的复制系数来运行。在结论段中,我们会谈谈针对有状态数据有什么更好的解决方案,因为Kubernetes并非真正是为状态设计的。

结论和建议

到现在为止,你已经完成了在Kubernetes构建并部署高可用WordPress和MySQL的安装!

不过尽管取得了这样的效果,你的研究之旅可能还远没有结束。可能你还没注意到,我们的安装仍然存在着单点故障:NFS服务器在WordPress pods之间共享/var/www/html目录。这项服务代表了单点故障,因为如果它没有运行,在使用它的pods上html目录就会丢失。教程中我们为服务器选择了非常稳定的镜像,可以在生产环境中使用,但对于真正的生产部署,你可以考虑使用GlusterFS对WordPress实例共享的目录开启多读多写。

这个过程涉及在Kubernetes上运行分布式存储集群,实际上这不是Kubernetes构建的,因此尽管它运行良好,但不是长期部署的理想选择。

对于数据库,我个人建议使用托管的关系数据库服务来托管MySQL实例,因为无论是Google的CloudSQL还是AWS的RDS,它们都以更合理的价格提供高可用和冗余处理,并且不需担心数据的完整性。Kuberntes并不是围绕有状态的应用程序设计的,任何建立在其中的状态更多都是事后考虑。目前有大量的解决方案可以在选择数据库服务时提供所需的保证。

也就是说,上面介绍的是一种理想的流程,由Kubernetes教程、web中找到的例子创建一个有关联的现实的Kubernetes例子,并且包含了Kubernetes 1.8.x中所有的新特性。

我希望通过这份指南,你能在部署WordPress和MySQL时获得一些惊喜的体验,当然,更希望你的运行一切正常。

使用Helm 在容器服务k8s集群一键部署wordpress

摘要: Helm 是啥? 微服务和容器化给复杂应用部署与管理带来了极大的挑战。Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernetes的apt-get / yum,由Deis 公司发起,该公司已经被微软收购。

Helm 是啥?

微服务和容器化给复杂应用部署与管理带来了极大的挑战。Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernetes的apt-get / yum,由Deis 公司发起,该公司已经被微软收购。Helm通过软件打包的形式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用部署和管理的复杂性。

Helm 架构

未分类

Helm 用途

做为Kubernetes的一个包管理工具,Helm具有如下功能:

  • 创建新的chart
  • chart打包成tgz格式
  • 上传chart到chart仓库或从仓库中下载chart
  • 在Kubernetes集群中安装或卸载chart
  • 管理用Helm安装的chart的发布周期

Helm有三个重要概念:

  • chart:包含了创建Kubernetes的一个应用实例的必要信息
  • config:包含了应用发布配置信息
  • release:是一个chart及其配置的一个运行实例

如何在阿里云容器服务使用Helm

阿里云容器服务的kubernets集群默认集成了helm并初始化提供了一些常用charts,下面我们就以安装wordpress示例来演示使用流程。

未分类

以上为容器服务默认提供的一些安装charts,下面我们来安装wordpress:

未分类

可以根据用户自身的需要,修改wordpress安装charts的一些默认配置,当然使用默认配置安装也是没问题的,输入本次安装release的名字,点击部署后就完成了一键部署。
我们使用控制台查看一下部署资源的情况:

未分类

可以看到wordpress的依赖资源都已经安装完毕,访问图中圈出来的地址就可以打开wordpress界面:

未分类

可以看到wordpress已经可以正常访问。如果使用传统方式,你可能需要创建一堆deployment + service + pvc等集合体,现在只需要一键部署,等待片刻,一个wordpress应用就可以展现在你面前。

WordPress上传文件提示HTTP错误解决实例

简述

在公司内部搭建内部视频学习网站,经过对比选择了WordPress进行站点搭建。但是在上传视频遭遇到了各种问题,特将此处理过程进行记录。

原因排查

1. 上传一个十几兆mp4的文件上传进度到达百分之百,会媒体提示http错误

未分类

2. 刚开始怀疑是PHP、Nginx的上传大小限制了。但是查看PHP、Nginx配置均配置了1000M

vim /etc/nginx/conf.d/default.conf
location / {
        root  /data/web;
        index  index.php index.html index.htm;
        client_max_body_size    000M;
}
vim /etc/php.ini
upload_max_filesize = 000M
post_max_size = 000M
max_execution_time = 300

3. 查看Nginx erro日志

tail /var/log/nginx/error.log
2018/02/14 09:32:07 [error] 87522#87522: *1 client intended to send too large body: 35016434 bytes, client: 36.111.88.33, server: localhost, request: "POST /wp-admin/async-upload.php HTTP/1.1", host: "117.66.240.116:81", referrer: "http://117.66.240.116:81/wp-admin/media-new.php"

只有下面这一行是最主要的保存信息。以下错误就是body限制大小的问题

client intended to send too large body

4. 将限制大小的设定在http中后上串资源就不会在有限制

vim /etc/nginx/nginx.conf
http{
    client_max_body_size    1000M;
keepalive_timeout  300;
}

如何修复 WordPress 中的 HTTP 错误

我们会向你介绍,如何在 Linux VPS 上修复 WordPress 中的 HTTP 错误。 下面列出了 WordPress 用户遇到的最常见的 HTTP 错误,我们的建议侧重于如何发现错误原因以及解决方法。

1、 修复在上传图像时出现的 HTTP 错误

如果你在基于 WordPress 的网页中上传图像时出现错误,这也许是因为服务器上 PHP 的配置,例如存储空间不足或者其他配置问题造成的。

用如下命令查找 php 配置文件:

php -i | grep php.ini
Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

根据输出结果,php 配置文件位于 /etc 文件夹下。编辑 /etc/php.ini 文件,找出下列行,并按照下面的例子修改其中相对应的值:

vi /etc/php.ini
upload_max_filesize = 64M
post_max_size = 32M
max_execution_time = 300
max_input_time 300
memory_limit = 128M

当然,如果你不习惯使用 vi 文本编辑器,你可以选用自己喜欢的。

不要忘记重启你的网页服务器来让改动生效。

如果你安装的网页服务器是 Apache,你也可以使用 .htaccess 文件。首先,找到 .htaccess 文件。它位于 WordPress 安装路径的根文件夹下。如果没有找到 .htaccess 文件,需要自己手动创建一个,然后加入如下内容:

vi /www/html/path_to_wordpress/.htaccess
php_value upload_max_filesize 64M
php_value post_max_size 32M
php_value max_execution_time 180
php_value max_input_time 180
# BEGIN WordPress
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index.php$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.php [L]
</IfModule>
# END WordPress

如果你使用的网页服务器是 nginx,在 nginx 的 server 配置块中配置你的 WordPress 实例。详细配置和下面的例子相似:

server {
  listen 80;
  client_max_body_size 128m;
  client_body_timeout 300;
  server_name your-domain.com www.your-domain.com;
  root /var/www/html/wordpress;
  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_params;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
  location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }
}

根据自己的 PHP 配置,你需要将 fastcgi_pass 127.0.0.1:9000; 用类似于 fastcgi_pass unix:/var/run/php7-fpm.sock; 替换掉(依照实际连接方式)

重启 nginx 服务来使改动生效。

2、 修复因为不恰当的文件权限而产生的 HTTP 错误

如果你在 WordPress 中出现一个意外错误,也许是因为不恰当的文件权限导致的,所以需要给 WordPress 文件和文件夹设置一个正确的权限:

chown www-data:www-data -R /var/www/html/path_to_wordpress/

将 www-data 替换成实际的网页服务器用户,将 /var/www/html/path_to_wordpress 换成 WordPress 的实际安装路径。

3、 修复因为内存不足而产生的 HTTP 错误

你可以通过在 wp-config.php 中添加如下内容来设置 PHP 的最大内存限制:

define('WP_MEMORY_LIMIT', '128MB');

4、 修复因为 php.ini 文件错误配置而产生的 HTTP 错误

编辑 PHP 配置主文件,然后找到 cgi.fix_pathinfo 这一行。 这一行内容默认情况下是被注释掉的,默认值为 1。取消这一行的注释(删掉这一行最前面的分号),然后将 1 改为 0 。同时需要修改 date.timezone 这一 PHP 设置,再次编辑 PHP 配置文件并将这一选项改成 date.timezone = Asia/Shanghai (或者将等号后内容改为你所在的时区)。

vi /etc/php.ini
cgi.fix_pathinfo=0
date.timezone = Asia/Shanghai

5、 修复因为 Apache mod_security 模块而产生的 HTTP 错误

如果你在使用 Apache mod_security 模块,这可能也会引起问题。试着禁用这一模块,确认是否因为在 .htaccess 文件中加入如下内容而引起了问题:

<IfModule mod_security.c>
  SecFilterEngine Off
  SecFilterScanPOST Off
</IfModule>

6、 修复因为有问题的插件/主题而产生的 HTTP 错误

一些插件或主题也会导致 HTTP 错误以及其他问题。你可以首先禁用有问题的插件/主题,或暂时禁用所有 WordPress 插件。如果你有 phpMyAdmin,使用它来禁用所有插件:在其中找到 wp_options 数据表,在 option_name 这一列中找到 active_plugins 这一记录,然后将 option_value 改为 :a:0:{}。

或者用以下命令通过SSH重命名插件所在文件夹:

mv /www/html/path_to_wordpress/wp-content/plugins /www/html/path_to_wordpress/wp-content/plugins.old

通常情况下,HTTP 错误会被记录在网页服务器的日志文件中,所以寻找错误时一个很好的切入点就是查看服务器日志。

利用nginx的fastcgi_cache缓存加速WordPress

WordPress有很多的缓存加速方案,例如插件缓存(wp-super-cache、wp-rocket等)、PHP代码缓存等等,现分享本站使用的nginx缓存。利用fastcgi_cache缓存。

未分类

在使用nginx缓存之前,必须在nginx里面加载专门的模块,这个模块叫做ngx_cache_purge。

添加ngx_cache_purge模块

下载ngx_cache_purge模块

ngx_cache_purge模块的官方地址:http://labs.frickle.com/files/。在这个地址找到最新版的模块版本 ,使用wget下载。

wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar zxvf ngx_cache_purge-2.3.tar.gz

我这里使用的就是ngx_cache_purge-2.3。

编译安装ngx_cache_purge模块

使用nginx -V命令查看nginx是否已经安装了这个模块,如果没有安装,需要重新编译安装。

使用军哥lnmp一键安装包的同学,可以在lnmp的安装目录中找到lnmp.conf这个文件,然后在nginx模块中添加ngx_cache_purge。之后重新平滑升级nginx即可。

修改ngxin配置

在使用fastcgi_cache缓存之前,必须先修改nginx配置,具体就是进入虚拟主机配置中,找到domainname.conf,然后修改里面的sever配置。

#下面2行的中的wpcache路径请自行提前创建,否则可能会路径不存在而无法启动nginx,max_size请根据分区大小自行设置
fastcgi_cache_path /tmp/wpcache levels=1:2 keys_zone=WORDPRESS:250m inactive=1d max_size=1G;
fastcgi_temp_path /tmp/wpcache/temp;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
#忽略一切nocache申明,避免不缓存伪静态等
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
#Ps:如果是多个站点,以上内容不要重复添加,否则会冲突,可以考虑将以上内容添加到nginx.conf里面,避免加了多次。
server
    {
        listen 80;
        #请修改为自己的域名
        server_name zhangge.net;
        index index.html index.htm index.php default.html default.htm default.php;
        #请修改为自己网站的存放路径
        root  /home/wwwroot/domainname.com;
        set $skip_cache 0;
        #post访问不缓存
        if ($request_method = POST) {
            set $skip_cache 1;
        }
        #动态查询不缓存
        if ($query_string != "") {
            set $skip_cache 1;
        }
        #后台等特定页面不缓存(其他需求请自行添加即可)
        if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
            set $skip_cache 1;
        }
        #对登录用户、评论过的用户不展示缓存(这个规则张戈博客并没有使用,所有人看到的都是缓存)
        if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
            set $skip_cache 1;
        }
        #这里请参考你网站之前的配置,特别是sock的路径,弄错了就502了!
        location ~ [^/].php(/|$)
            {
                try_files $uri =404;
                fastcgi_pass  unix:/tmp/php-cgi.sock;
                fastcgi_index index.php;
                include fastcgi.conf;
                #新增的缓存规则
                fastcgi_cache_bypass $skip_cache;
                fastcgi_no_cache $skip_cache;
                add_header X-Cache "$upstream_cache_status From $host";
                fastcgi_cache WORDPRESS;
                fastcgi_cache_valid 200 301 302 1d;
        }
        location / {
                #此处可以添加自定义的伪静态规则(之前你新增的伪静态规则可以添加到这,没有就不用了)
                try_files $uri $uri/ /index.php?$args;
                rewrite /wp-admin$ $scheme://$host$uri/ permanent;
         }
        #缓存清理配置(可选模块,请细看下文说明)
        location ~ /purge(/.*) {
            allow 127.0.0.1;
            allow "此处填写你服务器的真实外网IP";
            deny all;
            fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
        }
        location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
                access_log off; log_not_found off; expires max;
        }
        location = /robots.txt { access_log off; log_not_found off; }
        location ~ /. { deny  all; access_log off; log_not_found off; }
        #请注意修改日志路径
        access_log /home/wwwlogs/domainname.com.log access;

注意修改上述代码中的该修改部分,不然nginx重启会出错。当然,如果是启用了https,模块就应相应的改变。

安装Nginx-helper插件

在后台搜索nginx-helper,安装好插件。

关于插件的设置:

如果没有使用CDN就可以选择purge模式,如果使用了CDN最好选择文件模式。

由于插件作者定义的缓存路径是 /var/run/nginx-cache ,而我们可能会根据服务器实际情况来自定义缓存路径,这样一来,缓存路径的不同就会导致插件无法找到缓存文件并删除!

解决的方法:在wp-config.php中增加一行代码:

define( 'RT_WP_NGINX_HELPER_CACHE_PATH','/tmp/wpcache');

这样,就配置好了。

一分钟使用Docker快速搭建WordPress

1、apt install docker.io -y

2、pip install docker-compose

3、vim wordpress_stack.yml

version: '3.1'  

services:  

  wordpress:  
    image: wordpress  
    restart: always  
    ports:  
      - 80:80  
    environment:  
      WORDPRESS_DB_PASSWORD: mysqlrootpasswd  

  mysql:  
    image: mysql:5.7  
    restart: always  
    environment:  
      MYSQL_ROOT_PASSWORD: mysqlrootpasswd  

4、vim start.sh

#!/bin/bash  
docker-compose -f wordpress_stack.yml up -d  

5、 ./start.sh

6、 iptables -I INPUT 1 -p tcp –dport 80 -j ACCEPT

7、 打开http://localhost安装Wordpress

解决Nginx环境WordPress或Typecho设置固定链接无法打开的问题

做网站搭博客,首选都是自己买个国外VPS,400+一年费用一般比国内的虚拟空间稍贵点,但相比买虚拟空间VPS好太多:

  • 私有独享ip
  • 足够多的存储空间:基本上都是10G起,要放什么文件都可以,数据库也可以随意多个
  • 足够多的流量:一般都是500G起,相比虚拟主机的10G优越不是一点两点,几个朋友一起用都不是什么问题
  • 最重要的是,境外VPS还有其他的用途:比如翻墙梯

当然,国外VPS也有个比不了的,那就是速度没有国内的虚拟主机快,但不需要备案啊!!!而且,就一个小网页,速度差别几乎感受不到。

错误现象

自己的VPS就需要自己维护了,就是一台远程的电脑,你自己能折腾出花来都行。自己不会折腾找卖家装好环境自己用就行。
一般搭网站用LNMP环境,对于静态网站,nginx默认设置就行,但对于WordPress或者Typecho这种动态站点,默认会出现设置带目录的链接时无法打开的情况。

http://xxx.com/blog/
http://xxx.com/2018/
http://xxx.com/%postname%.html

不加设置以上形式的链接都会出现404错误。

解决办法

不支持目录链接是因为缺少伪静态规则,我们只需要按以下方法添加伪静态即可。

添加伪静态规则

Nginx环境下WordPress或者Typecho伪静态规则如下:

location / { 
  index index.html index.php; 
  if (-f $request_filename/index.html) { 
    rewrite (.*) $1/index.html break; 
  } 
  if (-f $request_filename/index.php) { 
    rewrite (.*) $1/index.php; 
  } 
  if (!-f $request_filename) { 
    rewrite (.*) /index.php; 
  } 
}

以上规则在nginx或者vhost配置中修改都可以。保存配置后,重启nginx一般就正常了。

开启PATHINFO

如果Typecho访问内页出现No input file specified错误提示,那么是没有开启pathinfo的支持。

方法:

找到/usr/local/php/etc/php.ini文件,将cgi.fix_pathinfo=0 改成 cgi.fix_pathinfo=1,保存后输入命令:service php-fpm重启php-fpm 即可。

LNMP下修改 WordPress 上传文件大小限制

摘要

这个设置对于不限流和服务器硬盘够大的网站来说还是很有用处的,特别是对于一些高清视频,放在第三方网站上引用的话经常会被添加”广告”的,通过上述的办法上传到自己服务器上的视频文件就不存在这个问题了,配合 CDN 的话,用户端访问播放也是毫无压力的。

在使用 WordPress 的时候,不知道大家有没有用到上传大容量文件需求,最近明月再给公司的网站上上传一些高清MP4 视频文件的时候就碰到这样的问题了, WordPress 默认限制可上传单个媒体文件的大小为50MB 的,对于MP4 视频文件来说这个50 MB 真的是属于”毛毛雨”的级别了,稍微达到”高清”级的MP4 视频10分钟以内的占用量都在100MB 以上了。

未分类

对于我们个人博客来说基本上是很少有这方面的需求的,但是对于企业公司网站还别说真的不保证啥时候会碰到的这个需求的。于是,只有求助于谷姐和度娘了,结果找到的资料依然是”乱”,基本上很多都是各说各的,并且大部分是针对 Apache 的。总之,很多搜索到的资料照着做的话都没有能成功上传的,最后没有办法只能是拼凑各个资料后来验证了,还好,最终让我给”拼凑”出在LNMP环境下的解决办法了。

这个解决办法其实很简单,就是通过修改LNMP里PHP的php.ini文件里的上传文件限制参数和Nginx里对应站点的配置文件里添加上传文件参数来实现的,也就是说只需要修改两个VPS/云服务器上的文件即可,今天明月就分享给大家,希望可以帮到有此需求的站长们。

修改LNMP环境下PHP的php.ini文件中:

upload_max_filesize= 300M //这个是文件上传大小限制


post_max_size=300M //这个是post请求大小限制

这两个参数,记得这两个参数没有在一起的,所以修改的时候一定要分别找到修改,然后保存退出。

然后再Nginx对应的站点配置文件里(也就是www.mydomain.com.conf这样的文件)里添加如下参数到对应位置,如下图所示:

未分类

其实就是告诉Nginx客户端上传文件的容量限制和超时标准,添加:

client_max_body_size 300m;


client_body_timeout 120;

这两个配置进去即可。

至此,重启一下LNMP生产环境即可生效了,这时候再次进入 WordPress 后台的”媒体”的添加里就可以看到,对应的上传文件大小限制已经成为300MB了,如下图:

未分类

其实,这个设置对于不限流和服务器硬盘够大的网站来说还是很有用处的,特别是对于一些高清视频,放在第三方网站上引用的话经常会被添加”广告”的,通过上述的办法上传到自己服务器上的视频文件就不存在这个问题了,配合 CDN 的话,用户端访问播放也是毫无压力的。