• WordPress+Nginx代理部署实战

    一、文档说明

     
    本文档主要介绍wordpress+nginx架构调整。
    WordPress默认的前端架构是httpd,为了便于管理和拓展需求,现替换为nginx作为前端代理,并使其实现前后端分离。

    二、建设背景

     
    一般情况我们架设wordpress 的结构是这样的:

    客户端直接访问Wordpress服务器,这种形式,前后端并未分离。服务器地址直接暴露在外,导致地址无法过滤,策略以及流量转发规则无法得以实现,并伴随着很多安全隐患。
    通过本次建设实施,实现前后端分离,前端Nginx接收客户端请求,根据策略负载至后端Wordpress服务器。下图所示架构:

    三、建设实施

    配置前端服务器

    下载nginx

    yum install -y nginx
    • 配置nginx配置文件,为了便于管理。在默认的nginx配置文件中输入如下命令:# include conf.d/*.conf,即可新建一个.conf的文件。
    vim tyun.cnserver {
    listen 80;
    return 301 https://www.tyun.cn; #强制跳转https
    }
    server {
    listen 443 ssl;# 监听端口
    server_name {server_name};# 域名
    ssl_certificate /usr/local/nginx/cert/www.tyun.cn.crt;# 证书路径
    ssl_certificate_key /usr/local/nginx/cert/www.tyun.cn.key;#key 路径#官网首页配置
    location / {
    root /data/website/tyun/;
    index index.html index.htm;
    }

    #反向代理配置
    location /blog/ {
    proxy_pass https://{后端服务器地址}/;

    }

    }

    •    注:后端服务器地址后面一定要加上/,不然传递至后端会带上/blog。

    配置后端服务器

    • 由于Wordpress有很多的PHP文件和请求,需要后端配置fastcgi转译服务,还需要配置重写地址策略,后端配置如下所示。
    vim tyun.cnserver {
    listen 80;
    return 301 https://$host$request_uri;
    }server {
    listen 443 ssl;

    #伪静态后页面什么的确实可以访问了,结果却出现新的问题,后台不能访问了,仔细观察发现后台所有地址都缺少wp-admin目录,又在网上去寻找答案,就是简单地加一行斜杠重定向而已,方法如下:
    rewrite /wp-admin$ $scheme://www.tyun.cn$uri/ permanent;

    access_log /var/log/nginx/host.access.log main;
    ssl_certificate 3585460_blog.tyun.cn.pem;
    ssl_certificate_key 3585460_blog.tyun.cn.key;

    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    #Wordpress配置
    #wordpress官方的伪静态是通过.htaccess实现的,但nginx并不支持.htaccess,网上找到wordpress伪静态的方法:
    location / {
      root /data/nginx/html;  #wordpress所在目录
      index index.html index.htm 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;
    }
      try_files $uri $uri/ /index.php?$args;
    }

    #fastcgi配置
    location ~ \.php$ {
      root /data/nginx/html;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ “wp-content” {

      root /data/nginx/html;
      index index.php;
    }

    }

    修改数据库

    • 前后端配置完成之后,因为之前的文章和一些图片地址是按照在服务器所在的地址写死在数据库里面的,由于现在架构改变了,需要对数据库字段进行修改。
    • wordpress域名修改以后,可以通过以下的sql语句修改wordpress数据库实现数据升级:
    UPDATE wp_options SET option_value = replace( option_value, ‘http://www.old.com’, ‘http://www.new.com’ ) WHERE option_name = ‘home’ OR option_name = ‘siteurl’;
    UPDATE wp_posts SET post_content = replace( post_content, ‘http://www.old.com’, ‘http://www.new.com’ ) ;
    UPDATE wp_posts SET guid = replace( guid, ‘http://www.old.com’, ‘http://www.new.com’ )
    • 服务端盖完之后,打开Wordpress的管理后台,登陆到后台,查看设置———>常规里面的URL是否正常:
    • 测试域名/blog是否正常。打开页面的时候f12查看元素页面和图片的URL是否正常。然后测试从首页跳转是否正常。
    • 在管理后台登陆不上的情况下,可以通过数据库更新URL。
    msyql -u xxx -p # 连接数据库。
    > use wordpress; # 使用数据库
    > update wp_options SET option_value=’http://www.example.com’ WHERE option_name=’home’;
    > update wp_options SET option_value=’http://www.example.com’ WHERE option_name=’siteurl’;

    管理后台登陆(地址过滤)

    • WordPress有自己的管理后台页面,一般情况下,域名地址是xxxx/wp-admin,在研究了Wordpress的默认配置发现,后端匹配到wp-admin之后转发成wp-login.php,然后在匹配自己的规则登陆管理后台。
    • 处于安全性考虑,我们限制ip登陆访问管理后台。在前端服务器去控制。
    vim tyun.cn
    server {
    listen 80;
    return 301 https://www.tyun.cn; #强制跳转https
    }
    server {
    listen 443 ssl;# 监听端口
    server_name {server_name};# 域名
    ssl_certificate /usr/local/nginx/cert/www.tyun.cn.crt;# 证书路径
    ssl_certificate_key /usr/local/nginx/cert/www.tyun.cn.key;#key 路径#官网首页配置
        location / {
            root /data/website/tyun/;
            index index.html index.htm;
            }#反向代理配置
        location /blog/ {
            proxy_pass https://{后端服务器地址}/;

          }

    #配置限制ip地址登陆管理后台
        location = /blog/wp-admin {
            if ($remote_addr != “xxx.xxx.xxx.xxx”) {
              return 403;
              }
          proxy_pass https://xxx.xxx.xxx.xxx/wp-admin/ ;

          }

    }

    • 如果需要用到域名拼接或者强制指定wordpress域名地址的同学,可以直接写死在Wordpress的配置文件中。(特殊情况)
    if ( ! empty( $_SERVER[‘HTTP_X_FORWARDED_HOST’] ) ) {
       $_SERVER[‘HTTP_HOST’] = $_SERVER[‘HTTP_X_FORWARDED_HOST’];
    }

     

    云管理服务专家徐磊原创

    «
    »
以专业成就每一位客户,让企业IT只为效果和安全买单

以专业成就每一位客户,让企业IT只为效果和安全买单