WordPress一次性搞定ssl全局设置以及潜在问题解决

首先按照自己的项目运行服务器把证书安装好,干货君以腾讯云为例:证书安装指引 – SSL 证书 – 文档平台 – 腾讯云文档平台 – 腾讯云。

干货君使用nginx反向代理,apache作为项目运行服务器为例,修改nginx/conf文件夹下面的nginx.conf(将下方代码块添加到文件中或把文件中443代码块按此方式设置)。

server {
listen 443;
server_name www.nrgh.org; #填写绑定证书的域名
ssl on;
ssl_certificate 1_www.nrgh.org_bundle.crt;
ssl_certificate_key 2_www.nrgh.org.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;
location / {
#项目路径,或反向代理的代码块
proxy_pass http://nrgh;
} 
}

未分类

上方搞定在nginx.conf中加入下面这个代码块,你要负载均衡(集群使用)也是在这个代码块中搞

upstream www{
#下方写要代理的ip和端口号,下面ip是乱写的,真实的已隐去
server 111.111.205.11:56;
}

未分类

server {
listen 80;
server_name http://www.nrgh.org
if ($scheme = http ) {
#http请求转换为https
return 301 https://$server_name$request_uri;
}
#即所有请求都到这里去找分配
location / {
#全局实现80进来的请求,重定向为https了
proxy_pass http://www;
#rewrite ^/(.*) https://$server_name/$1 permanent;
}
}

上面都配置之后,运行 nginx -t 并重启nginx试试效果

接下来说下会出现的问题:

1、上面都搞定之后,wordpress网站可能出现css和js还是走http请求,文章链接走https请求,这时候需要你把wordpress的媒体文件绝对路径替换相对路径,方法如下:

2、wordpress/wp-admin 后台进不去,登录无反应;

3、百度找了很多解决方法,却依然没有解决,甚至搞的连网站都打不开了;

4、等等。。。

一、系统文件修改

路径:网站根目录wp-includesfunctions.php
找到代码 require( ABSPATH . WPINC . ‘/option.php’ );
在下方添加:

add_filter('script_loader_src', 'agnostic_script_loader_src', 20,2); function agnostic_script_loader_src($src, $handle) { return preg_replace('/^(http|https):/', '', $src); } add_filter('style_loader_src', 'agnostic_style_loader_src', 20,2); function agnostic_style_loader_src($src, $handle) { return preg_replace('/^(http|https):/', '', $src); }

二、后台文件修改

路径:网站根目录wp-config.php
找到代码:

*
* @package WordPress
*/

在下方添加如下代码:

$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

三、安装插件

完成以上两步操作后,可以正常访问https开头的网站和后台,
下载这个叫“really-simple-ssl”的WordPress插件:

Really Simple SSL

登录后台安装此插件。

至此,真正意义上解决wordpress全站开启https的ssl证书问题。

wordpress启用https301重定向htaccess规则

谷歌浏览器一直在推行https,而今年更新通知7月份会将http标记为不安全,于是下定决心博客启用https。经过一番折腾,最后终于改造成功,但是最后找了很多http301重定向到https的规则,很多都只能定向首页,而不能全站301。最后才找到一个可以用的,分享给大家

未分类

htaccess规则

如果是没有htaccess规则,可以直接用以下规则

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

如果已有如下默认规则,

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# BEGIN WordPress
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# EDN WordPress

注:规则必须加载 # BEGIN WordPress和# EDN WordPress之外

301状态码检测

可以通过站长工具(http://tool.chinaz.com/pagestatus/)进行状态码检测

未分类

检测主页和内页同时返回正确的301状态码,可以到百度站长平台进行https验证

验证后很快快照就会更新成https

他们将生产环境从 nginx 迁移到 envoy

导读:随着Service Mesh在最近一年进入人们的视野,Envoy 作为其中很关键的组件,也开始被广大技术人员熟悉。本文作者所在公司已经从 nginx 迁移到 Envoy。

随着我们下一代产品发布,我们将代理软件从 nginx 切换到 Envoy 。

我们很早就开始关注 Envoy。 公司的一些人之前在 Twitter 工作,其中一些人和 Matt Klein 一起组建了 Twitter 的边缘代理 TFE。 我们知道 Lyft 正在计划建立一个基于 TFE 的开源代理模型,我们对此很感兴趣。 不幸的是,我们刚开始做自己产品的时候它还没有准备好,所以起初我们还是使用 nginx。

我们很高兴看到 Envoy 的最初功能集合中包含了大量灵活运用微服务的想法。 我们更加兴奋地看到它的社区已经成型并且技术已经成熟。 现在 Envoy 提供的功能(相比于 nginx)可以使我们能够更快地为客户提供新功能。当然,Envoy 的功能路线图也非常令人兴奋。

选择代理

在启动Turbine Labs时,我们就知道负载均衡将成为我们基础架构的关键组成部分。

在2015年秋季的时候,代理软件并不是我们今天看到的样子。

我们选择 nginx 是因为它轻巧,经过大量生产环境测试,开源,相对来说易于扩展,并且拥有蓬勃发展的用户群体。然而我们必须做很多额外的工作才能在 nginx 之上构建一个全功能的流量管理解决方案。

服务发现,统计管理和更细粒度的负载均衡是现代基础架构的关键特性。 我们在 nginx 之上来实现这些功能,虽然已经花了很长时间,但仍有很多工作要做。

相比之下,Envoy 有很多非常有用功能(如 gRPC,tracing 等等),同时提供类似(或更好)的性能,稳定性和社区。

克服反对意见

采用任何新技术都需要考虑相反的意见。 由于我们已经部署了代理服务,不仅需要考虑到自己的问题,还需要考虑到客户提出的问题。 对于开源项目,这些问题通常分为以下几类:

我们一直密切关注 Envoy 的开发进展,并对它的成熟速度感到惊讶。已经有不少公司在生产环境使用 Envoy。Envoy 现在是一个 CNCF 项目,这意味着社区是透明和开放的。 代码贡献者来自很多公司,我们也在其中。

成本也是需要考虑的因素。随着 sidecars 成为更普遍的部署方式,代理会得到更广泛的应用。 虽然许多客户将继续集中式运行负载均衡,但我们希望代理软件可以优雅地支持边车部署模型。

Envoy 采用 C++ 11 编写,运行时占用的内存很少,与依赖较重运行时的代理相比,显着减少了 sidecars 部署的负担。

服务提供方的好处

应始终谨慎对待技术堆栈的大型更改。我们没有轻易转向 Envoy,但我们获得的好处以及我们可以传递给我们客户的好处非常显著。

可管理性

从一开始,Envoy 就被设计为可以大规模管理。 我们已经做了很多工作来使我们的基于 nginx 的代理可管理,但是这个配置接口不太容易地暴露给其他工具。

Envoy 数据平面 API 为其集中管理提供了一个开放标准。 我们可以提供一个集中的,开放的控制点,而不是复制配置文件。

可扩展性

nginx 是一个非常成功,稳定的开源项目。 其配置文件和模块生态系统具有较大的外围应用,并有大量现有用户支持。 给 nginx 贡献核心代码是非常有挑战性的,这导致在许多情况下需要编写自定义模块或 Lua 脚本以扩展其功能。

Envoy 更为聚焦,使用更为现代的语言支持改变代理行为。过去几个月中,我们向 Envoy 提交了超过 30 个功能,其中包括 OSX 构建 ,子集负载均衡和 upstream 日志记录等主要功能。

服务使用方的好处

更丰富的群集模型

我们在 nginx 上做了一些扩展,从而增强其 upstream 模型并添加更多细节。在同时部署同一服务的多个版本时,仅仅了解实例的主机和端口是不够的。

Envoy(通过我们贡献的补丁)允许将任意元数据附加到服务实例,以及定义基于该元数据定义路由规则。这使先进的流量管理技术成为可能,例如增量发布, 蓝/绿版本,无缝整体分解和生产测试 。

多协议支持

NGINX支持很多协议。 Envoy 的架构可以轻松地添加对新协议的支持,并且它也提供了多种协议支持。 虽然 HTTP 占据了互联网流量的很大一部分,但增加对 Redis,Mongo,Dynamo,websockets 和 gRPC 流量的可见性也是非常重要的。

动态服务发现

随着微服务,容器变得越来越流行,服务拓扑变得更加动态。配置文件中的服务器列表很快就会过时。 Envoy 使用一种最终一致的模型来进行 API 驱动的服务发现,并且能够很好地处理变化频繁的实例。

我们目前从各种平台收集数据,而 Envoy 的群集发现服务(CDS)为我们提供了比固定配置文件更自然的抽象。 Envoy 通过支持监听器发现服务(LDS)和路由发现服务(RDS)支持路由拓扑发现,从而进一步加强了这一点。 最终允许从中央控制点动态重新配置大部分服务拓扑,这非常有用。

网络策略

微服务意味着网络更加依赖于服务抽象边界。 随着相互依赖的服务数量日渐增长,系统100%没问题的时间会变少,整个系统经常有部分功能处于降级状态。

管理网络策略(如重试,超时和速率限制)对于在面对系统健康问题时保持顺畅的客户体验至关重要。Envoy 允许在代理(每个路由) 和客户端(每个请求的基础上)配置这些策略。 这可以灵活地实现(难以用 nginx 实现的)极细粒度弹性策略。

监测

Envoy 使用行业标准的请求日志,还提供与各种监测系统的集成。 它还提供对 Zipkin 和 Lightstep 的原生支持,以便追踪整个请求链。

如何更快迁移

我们对迁移到 Envoy 的过程非常满意。 它稳定,快速,轻便,并拥有一个伟大的社区。 它的架构使其非常适合微服务,但它同样适合做边缘代理。 作为基础服务,使用配置API而非静态配置文件真是太棒了。

如果你已经开始使用 Envoy,或者正在考虑迁移到 Envoy,那就可以考虑使用我们的服务。凭借广泛的服务发现和卓越的管理界面,我们可以帮助您快速,平稳地部署和运营 Envoy。

英文原文:

https://blog.turbinelabs.io/our-move-to-envoy-bfeb08aa822d

更多 Envoy 介绍:

https://www.envoyproxy.io/

Nginx利用fastcgi_cache缓存php页面

前言

fastcgi_cache是一个nginx的插件,用于缓存fastcgi接口的执行结果,例如缓存php的执行结果。特别是php网站的首页与一些非交互页面,利用fastcgi_cache可以大幅度提升访问速度,并且降低php的执行压力。

配置

1. 在nginx的主配置文件

在主配置文件(nginx.conf)中添加缓存域

fastcgi_cache_path /dev/shm/nginx-cache levels=1:2 keys_zone=cgi_wpcache:200m inactive=1d;

fastcgi_cache_path:缓存文件的路径,/dev/shm/为tmfs缓存文件系统,

实际储存在内存中,所以读写IO性能更高。
levels:缓存目录的结构层次,例如1:2,缓存文件会就生成在指定目录的再下两层目录中。
keys_zone:缓存域名称,在vhost内进行缓存时需要调用。
inactive:缓存不活动时间,若缓存内容在指定时间内未被访问将会被清理出缓存域。

2. 站点配置

location /archives/ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /data/webroot/$fastcgi_script_name;
include fastcgi_params;
  fastcgi_cache cgi_wpcache;
  fastcgi_cache_methods GET HEAD;
  fastcgi_cache_key $request_method$host$request_uri;
  fastcgi_cache_valid 200 2d;
  fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
  add_header X-Cache “$upstream_cache_status”;
}

fastcgi_cache:指定缓存域
fastcgi_cache_methods:指定缓存的请求方式
fastcgi_cache_key:指定缓存文件的标识,这个标识会MD5转码存储在缓存域的目录下
fastcgi_cache_valid:指定缓存状态,例如上文中只缓存响应状态码为200的请求所产生的返回页面两天
fastcgi_ignore_headers:默认情况下fastcgi_cache会忽略有特殊header的请求,并不进行缓存,官网说明。但当我们添加这个参数后,这些限制将不在存在。
add_header 将会在返回请求的response的header中添加一个X-Cache字段表示是否进行了缓存。如果需要也可以在nginx日志中通过log_format添加$upstream_cache_status字段

  • ·MISS 未命中,请求被传送到后端
  • ·HIT 缓存命中
  • ·EXPIRED 缓存已经过期请求被传送到后端
  • ·UPDATING 正在更新缓存,将使用旧的应答
  • ·STALE 后端将得到过期的应答

3.验证

配置完成后重新加载nginx后通过curl -I 访问如下:

[root@localhost local]# curl -I localhost/archives/1.php
HTTP/1.1 200 OK
Server: nginx/1.14.0
Date: Mon, 25 Jun 2018 06:48:05 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/7.0.30
Expires: Tue, 26 Jun 2018 06:48:05 GMT
Cache-Control: max-age=86400
X-Cache: MISS

第一次访问 X-Cache: MISS 说明还未进行缓存。

[root@localhost local]# curl -I localhost/archives/1.php
HTTP/1.1 200 OK
Server: nginx/1.14.0
Date: Mon, 25 Jun 2018 06:50:57 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/7.0.30
Expires: Tue, 26 Jun 2018 06:48:05 GMT
Cache-Control: max-age=86400
X-Cache: HIT

第二次访问发现X-Cache: HIT,表明/archives/1.php这个url已经被缓存,再下次访问nignx将不再会去请求php-fpm进行执行,而会直接从缓存中读取并返回,能够大大提高网站速度。

4. 遇到问题

a)访问空白
配置完毕后发现时常会出现页面访问空白的情况,再清空缓存目录后重新访问就恢复了。
经过测试发现是由于第一次使用HEAD方式访问,返回一个body为空的响应并被缓存了,所以之后再次访问就获取到了空白的页面。
这是由于fastcgi_cache_key中没有设置$request_method,将GET和HEAD的请求存储到了同一个key中。

b)页面缓存失败,一直MISS
默认情况下,请求的header中包含“Expires”, “Cache-Control”, “Set-Cookie”等,页面将不会被缓存,所以添加fastcgi_ignore_headers Cache-Control Expires Set-Cookie;即可。

nginx下禁止访问.git等隐藏文件夹

今天进腾讯云的控制台 偶然发现腾讯云一直给我提示的漏洞 其中有一个挺为严重的 汗.png

未分类

我的网站配置下并没有屏蔽隐藏文件夹例如.git等文件夹的访问 甚至可以直接下载隐藏文件夹的内容
确实是我没有想到的 如果你也有这种情况 就需要进行配置服务器来禁止敏感文件的访问了 否则就直接暴露在大庭广众之下了…

nginx的配置很简单

在server{}段内增加
代码如下:

location ~ /.
{
deny all;
}

这样就把所有的隐藏文件夹给屏蔽访问了 如果想单独屏蔽某一隐藏文件夹的访问只需要

location ^~ /.git
{
return 444;
}

阿里云DOCKER标准日志采集(NGINX)

部署Logtail容器

1. 拉取Logtail镜像

docker pull registry.cn-hangzhou.aliyuncs.com/log-service/logtail

2. 启动Logtail容器

docker run -d -v /:/logtail_host:ro -v /var/run/docker.sock:/var/run/docker.sock --env ALIYUN_LOGTAIL_CONFIG=/etc/ilogtail/conf/${your_region_name}/ilogtail_config.json --env ALIYUN_LOGTAIL_USER_ID=${your_aliyun_user_id} --env ALIYUN_LOGTAIL_USER_DEFINED_ID=${your_machine_group_user_defined_id} registry.cn-hangzhou.aliyuncs.com/log-service/logtail

参数说明

参数                                  参数说明

${your_region_name}                 region名,请替换为您创建的日志服务project所在Region。Region名称请从Logtail安装参数列表中选择。
${your_aliyun_user_id}                  用户标识,请替换为您的阿里云主账号用户ID。主账号用户ID为字符串形式。
${your_machine_group_user_defined_id}   您集群的机器组自定义标识。如您尚未开启自定义标识,请参考自定义机器组的步骤一,开启userdefined-id。

示例:docker run -d -v /:/logtail_host:ro -v /var/run/docker.sock:/var/run/docker.sock –env ALIYUN_LOGTAIL_CONFIG=/etc/ilogtail/conf/cn-hangzhou_internet/ilogtail_config.json –env ALIYUN_LOGTAIL_USER_ID=1473463995701522 –env ALIYUN_LOGTAIL_USER_DEFINED_ID=aliyun-sunaiwen-machine registry.cn-hangzhou.aliyuncs.com/log-service/logtail

查看lables配置信息

docker inspect 3fb1dd4bd2c7

logtail配置

未分类

未分类

使用Docker 实现微服务并搭建博客,一文全掌握。

未分类

Docker 是一个容器工具,提供虚拟环境。很多人认为,它改变了我们对软件的认识。

本文,通过搭建一个博客的例子,来介绍如何使用Docker实现微服务。
站在 Docker 的角度,软件就是容器的组合:业务逻辑容器、数据库容器、储存容器、队列容器……Docker 使得软件可以拆分成若干个标准化容器,然后像搭积木一样组合起来。
这正是微服务(microservices)的思想:软件把任务外包出去,让各种外部服务完成这些任务,软件本身只是底层服务的调度中心和组装层。

未分类

微服务很适合用 Docker 容器实现,每个容器承载一个服务。一台计算机同时运行多个容器,从而就能很轻松地模拟出复杂的微服务架构。

未分类

上一篇教程介绍了 Docker 的概念和基本用法,本文接着往下介绍,如何在一台计算机上实现多个服务,让它们互相配合,组合出一个应用程序。

未分类

我选择的示例软件是 WordPress。它是一个常用软件,全世界用户据说超过几千万。同时它又非常简单,只要两个容器就够了(业务容器 + 数据库容器),很适合教学。而且,这种”业务 + 数据库”的容器架构,具有通用性,许多应用程序都可以复用。

为了加深读者理解,本文采用三种方法,演示如何架设 WordPress 网站。

  • 方法 A:自建 WordPress 容器
  • 方法 B:采用官方的 WordPress 容器
  • 方法 C:采用 Docker Compose 工具

一、预备工作:image 仓库的镜像网址

本教程需要从仓库下载 image 文件,但是国内访问 Docker 的官方仓库很慢,还经常断线,所以要把仓库网址改成国内的镜像站。这里推荐使用官方镜像 registry.docker-cn.com 。下面是我的 Debian 系统的默认仓库修改方法,其他系统的修改方法参考官方文档。
打开/etc/default/docker文件(需要sudo权限),在文件的底部加上一行。

DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"

然后,重启 Docker 服务。

$ sudo service docker restart

现在就会自动从镜像仓库下载 image 文件了。

二、方法 A:自建 WordPress 容器

前面说过,本文会用三种方法演示 WordPress 的安装。第一种方法就是自建 WordPress 容器。

2.1 官方 的 PHP image

首先,新建一个工作目录,并进入该目录。

$ mkdir docker-demo && cd docker-demo

然后,执行下面的命令。

$ docker container run 
  --rm 
  --name wordpress 
  --volume "$PWD/":/var/www/html 
  php:5.6-apache

上面的命令基于php的 image 文件新建一个容器,并且运行该容器。php的标签是5.6-apache,说明装的是 PHP 5.6,并且自带 Apache 服务器。该命令的三个参数含义如下。

  • –rm:停止运行后,自动删除容器文件。
  • –name wordpress:容器的名字叫做wordpress。
  • –volume “$PWD/”:/var/www/html:将当前目录($PWD)映射到容器的/var/www/html(Apache 对外访问的默认目录)。因此,当前目录的任何修改,都会反映到容器里面,进而被外部访问到。

运行上面的命令以后,如果一切正常,命令行会提示容器对外的 IP 地址,请记下这个地址,我们要用它来访问容器。我分配到的 IP 地址是 172.17.0.2。

打开浏览器,访问 172.17.0.2,你会看到下面的提示。

Forbidden
You don't have permission to access / on this server.

这是因为容器的/var/www/html目录(也就是本机的docker-demo目录)下面什么也没有,无法提供可以访问的内容。

请在本机的docker-demo目录下面,添加一个最简单的 PHP 文件index.php。

<?php 
phpinfo();?>

保存以后,浏览器刷新172.17.0.2,应该就会看到熟悉的phpinfo页面了。

未分类

2.2 拷贝 WordPress 安装包

既然本地的docker-demo目录可以映射到容器里面,那么把 WordPress 安装包拷贝到docker-demo目录下,不就可以通过容器访问到 WordPress 的安装界面了吗?

首先,在docker-demo目录下,执行下面的命令,抓取并解压 WordPress 安装包。

$ wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
$ tar -xvf wordpress-4.9.4-zh_CN.tar.gz

解压以后,WordPress 的安装文件会在docker-demo/wordpress目录下。

这时浏览器访问http://172.17.0.2/wordpress,就能看到 WordPress 的安装提示了。

未分类

2.3 官方的 MySQL 容器

WordPress 必须有数据库才能安装,所以必须新建 MySQL 容器。

打开一个新的命令行窗口,执行下面的命令。

$ docker container run 
  -d 
  --rm 
  --name wordpressdb 
  --env MYSQL_ROOT_PASSWORD=123456 
  --env MYSQL_DATABASE=wordpress 
  mysql:5.7

上面的命令会基于 MySQL 的 image 文件(5.7版本)新建一个容器。该命令的五个命令行参数的含义如下。

  • -d:容器启动后,在后台运行。
  • –rm:容器终止运行后,自动删除容器文件。
  • –name wordpressdb:容器的名字叫做wordpressdb
  • –env MYSQL_ROOT_PASSWORD=123456:向容器进程传入一个环境变量MYSQL_ROOT_PASSWORD,该变量会被用作 MySQL 的根密码。
  • –env MYSQL_DATABASE=wordpress:向容器进程传入一个环境变量MYSQL_DATABASE,容器里面的 MySQL 会根据该变量创建一个同名数据库(本例是WordPress)。

运行上面的命令以后,正常情况下,命令行会显示一行字符串,这是容器的 ID,表示已经新建成功了。

这时,使用下面的命令查看正在运行的容器,你应该看到wordpress和wordpressdb两个容器正在运行。

$ docker container ls

其中,wordpressdb是后台运行的,前台看不见它的输出,必须使用下面的命令查看。

$ docker container logs wordpressdb

2.4 定制 PHP 容器

现在 WordPress 容器和 MySQL 容器都已经有了。接下来,要把 WordPress 容器连接到 MySQL 容器了。但是,PHP 的官方 image 不带有mysql扩展,必须自己新建 image 文件。

首先,停掉 WordPress 容器。

$ docker container stop wordpress

停掉以后,由于–rm参数的作用,该容器文件会被自动删除。

然后,在docker-demo目录里面,新建一个Dockerfile文件,写入下面的内容。

FROM php:5.6-apache
RUN docker-php-ext-install mysqli
CMD apache2-foreground

上面代码的意思,就是在原来 PHP 的 image 基础上,安装mysqli的扩展。然后,启动 Apache。

基于这个 Dockerfile 文件,新建一个名为phpwithmysql的 image 文件。

$ docker build -t phpwithmysql .

2.5 WordPress 容器连接 MySQL

现在基于 phpwithmysql image,重新新建一个 WordPress 容器。

$ docker container run 
  --rm 
  --name wordpress 
  --volume "$PWD/":/var/www/html 
  --link wordpressdb:mysql 
  phpwithmysql

跟上一次相比,上面的命令多了一个参数–link wordpressdb:mysql,表示 WordPress 容器要连到wordpressdb容器,冒号表示该容器的别名是mysql。

这时还要改一下wordpress目录的权限,让容器可以将配置信息写入这个目录(容器内部写入的/var/www/html目录,会映射到这个目录)。

$ chmod -R 777 wordpress

接着,回到浏览器的http://172.17.0.2/wordpress页面,点击”现在就开始!”按钮,开始安装。

WordPress 提示要输入数据库参数。输入的参数如下。

未分类

  • 数据库名:wordpress
  • 用户名:root
  • 密码:123456
  • 数据库主机:mysql
  • 表前缀:wp_(不变)

点击”下一步”按钮,如果 WordPress 连接数据库成功,就会出现下面的页面,这就表示可以安装了。

未分类

至此,自建 WordPress 容器的演示完毕,可以把正在运行的两个容器关闭了(容器文件会自动删除)。

$ docker container stop wordpress wordpressdb

三、方法 B:Wordpress 官方镜像

上一部分的自建 WordPress 容器,还是挺麻烦的。其实不用这么麻烦,Docker 已经提供了官方 WordPress image,直接用那个就可以了。有了上一部分的基础,下面的操作就很容易理解了。

3.1 基本用法

首先,新建并启动 MySQL 容器。

$ docker container run 
  -d 
  --rm 
  --name wordpressdb 
  --env MYSQL_ROOT_PASSWORD=123456 
  --env MYSQL_DATABASE=wordpress 
  mysql:5.7

然后,基于官方的 WordPress image,新建并启动 WordPress 容器。

$ docker container run 
  -d 
  --rm 
  --name wordpress 
  --env WORDPRESS_DB_PASSWORD=123456 
  --link wordpressdb:mysql 
  wordpress

上面命令中,各个参数的含义前面都解释过了,其中环境变量WORDPRESS_DB_PASSWORD是 MySQL 容器的根密码。

上面命令指定wordpress容器在后台运行,导致前台看不见输出,使用下面的命令查出wordpress容器的 IP 地址。

$ docker container inspect wordpress

上面命令运行以后,会输出很多内容,找到IPAddress字段即可。我的机器返回的 IP 地址是172.17.0.3。

浏览器访问172.17.0.3,就会看到 WordPress 的安装提示。

未分类

3.2 WordPress 容器的定制

到了上一步,官方 WordPress 容器的安装就已经成功了。但是,这种方法有两个很不方便的地方。

  • 每次新建容器,返回的 IP 地址不能保证相同,导致要更换 IP 地址访问 WordPress。
  • WordPress 安装在容器里面,本地无法修改文件。

解决这两个问题很容易,只要新建容器的时候,加两个命令行参数就可以了。

先把刚才启动的 WordPress 容器终止(容器文件会自动删除)。

$ docker container stop wordpress

然后,使用下面的命令新建并启动 WordPress 容器。

$ docker container run 
  -d 
  -p 127.0.0.2:8080:80 
  --rm 
  --name wordpress 
  --env WORDPRESS_DB_PASSWORD=123456 
  --link wordpressdb:mysql 
  --volume "$PWD/wordpress":/var/www/html 
  wordpress

上面的命令跟前面相比,命令行参数只多出了两个。

  • -p 127.0.0.2:8080:80:将容器的 80 端口映射到127.0.0.2的8080端口。
  • –volume “$PWD/wordpress”:/var/www/html:将容器的/var/www/html
    目录映射到当前目录的wordpress子目录。

浏览器访问127.0.0.2:8080:80就能看到 WordPress 的安装提示了。而且,你在wordpress子目录下的每次修改,都会反映到容器里面。

最后,终止这两个容器(容器文件会自动删除)。

$ docker container stop wordpress wordpressdb

四、方法 C:Docker Compose 工具

上面的方法 B 已经挺简单了,但是必须自己分别启动两个容器,启动的时候,还要在命令行提供容器之间的连接信息。因此,Docker 提供了一种更简单的方法,来管理多个容器的联动。

4.1 Docker Compose 简介

未分类

Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。

$ docker-compose up
$ docker-compose stop

4.2 Docker Compose 的安装

Mac 和 Windows 在安装 docker 的时候,会一起安装 docker compose。Linux 系统下的安装参考官方文档。

安装完成后,运行下面的命令。

$ docker-compose --version

4.3 WordPress 示例

在docker-demo目录下,新建docker-compose.yml文件,写入下面的内容。

mysql:
    image: mysql:5.7
    environment:
     - MYSQL_ROOT_PASSWORD=123456
     - MYSQL_DATABASE=wordpress
web:
    image: wordpress
    links:
     - mysql
    environment:
     - WORDPRESS_DB_PASSWORD=123456
    ports:
     - "127.0.0.3:8080:80"
    working_dir: /var/www/html
    volumes:
     - wordpress:/var/www/html

上面代码中,两个顶层标签表示有两个容器mysql和web。每个容器的具体设置,前面都已经讲解过了,还是挺容易理解的。

启动两个容器。

$ docker-compose up

浏览器访问 http://127.0.0.3:8080,应该就能看到 WordPress 的安装界面。

现在关闭两个容器。

$ docker-compose stop

关闭以后,这两个容器文件还是存在的,写在里面的数据不会丢失。下次启动的时候,还可以复用。下面的命令可以把这两个容器文件删除(容器必须已经停止运行)。

$ docker-compose rm

搭建keepalived+mysql主从复制高可用

准备工作

  • 完成keepalived的安装
  • 完成docker的安装
  • docker镜像里面自行安装iproute2, vim, iputils-ping(可选)等工具,便于测试
apt-get install iproute2
apt-get install vim
apt-get install iputils-ping

主数据库master

1. 使用docker安装mysql

mkdir -p ~/compose/mysql-master
cd ~/compose/mysql-master

cat docker-compose.yml
version: '2'
services:
  mysql-master:
    image: mysql:5
    restart: always
    container_name: mysql-master
    ports:
      - 3306:3306
    volumes:
      - ./conf.d:/etc/mysql/conf.d
      - /data/docker/mysql-master/data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=123456
networks:
  default:
    external:
      name: service

假如没有把3306端口映射到宿主机,在宿主机上可通过docker-ip:3306来访问。

2. mysql的配置

cat conf.d/lowercase.cnf
[mysqld]
lower_case_table_names = 1
default-time-zone = '+08:00'
character-set-server = utf8
event_scheduler = on
log-bin = mysql-bin
server-id = 1

参数说明:

  • lower_case_table_names 设置不区分大小写
  • default-time-zone 设置时区为东八区
  • character-set-server 修改字符集为utf8
  • log-bin 开启二进制日志
  • server-id 设置server-id

master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,具体在mysql配置文件的[mysqld]可添加修改如下选项:

# 不同步哪些数据库
binlog-ignore-db = mysql  
binlog-ignore-db = test  
binlog-ignore-db = information_schema  
# 只同步哪些数据库,除此之外,其他不同步
binlog-do-db = mydatabase

3. 启动服务

docker-compose pull && docker-compose up -d

4. 在宿主机连接mysql

说明: 由于我是使用虚拟机安装的字符版Ubuntu系统,所以使用MyCli作为mysql命令行工具来连接mysql。

# 查看master主机的ip地址为192.168.11.188,使用MyCli连接mysql
mycli -h 192.168.11.188 -u root -p 123456

# 给root用户分配远程访问权限:
grant all on *.* to root@'%' identified by "123456";
flush privileges; 

# 查看master状态
mysql [email protected]:(none)> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 | 586      |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set
Time: 0.004s

需要记录主数据库的二进制文件名(mysql-bin.000003)和位置586。

从数据库slave

1. docker-compose.yml

只需要从主数据库的配置名称由mysql-master改为mysql-slave即可。

2. mysql配置

cat conf.d/lowercase.cnf
[mysqld]
lower_case_table_names = 1
default-time-zone = '+08:00'
character-set-server = utf8
event_scheduler = on
server-id= 2

需添加server-id并且与主数据库中不一致

3. 启动服务

docker-compose pull && docker-compose up -d

4. 在宿主机连接mysql

# 查看slave主机的ip地址为192.168.11.186,使用MyCli连接mysql
mycli -h 192.168.11.186 -u root -p 123456
# 给root用户分配远程访问权限,略

# 执行同步SQL语句,参照MASTER配置:
CHANGE MASTER TO MASTER_HOST='192.168.11.188',MASTER_USER='root',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=586;

# 启动slave同步进程
start slave;

# 查看slave状态:
show slave statusG;

其中下面两项为YES则表示成功:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

测试主从复制

在MASTER中新建数据库和表,发现数据在SLAVE中已经实时同步过来

Keepalived监控mysql服务

1. master主机上的配置

cat /etc/keepalived/keepalived.conf

vrrp_script chk_mysql_port {     #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/opt/chk_mysql.sh"   #这里通过脚本监测
    interval 2                   #脚本执行间隔,每2s检测一次
    weight -5                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                    #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {
    state MASTER
    interface ens33 #指定虚拟ip的网卡接口,不一定是eth0根据ifconfig确定
    virtual_router_id 51 #路由器标识,MASTER和BACKUP必须是一致的
    priority 100 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.11.25
    }
    track_script {
       chk_mysql_port
    }
}

需要配置的地方有:script,state,interface,virtual_router_id,priority,virtual_ipaddress等

2. slave主机上的配置

cat /etc/keepalived/keepalived.conf

vrrp_script chk_mysql_port {     
    script "/opt/chk_mysql.sh"
    interval 2
    weight -5
    fall 2
    rise 1
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.11.25
    }
    track_script {
       chk_mysql_port
    }
}

只需要设置state为BACKUP, priority比MASTER低即可。

3. 监测监本的配置

cat /opt/chk_mysql.sh

#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]
then
    /etc/init.d/keepalived stop
else
   echo "running..." >> /opt/keepalived-running-info.log
   sleep 5000
fi

Keepalived监测Mysql测试

先要保证两台服务器的mysql服务正常启动哦~

1. 启动Keepalived

# 在master和slave上执行
sudo /etc/init.d/keepalived start

# 查看脚本是否正常执行
tail -f /opt/keepalived-running-info.log

# 查看master的ip,发现虚拟ip绑定成功
ip addr

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:64:35:17 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.188/24 brd 192.168.11.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.11.25/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe64:3517/64 scope link
       valid_lft forever preferred_lft forever

2. 高可用测试

在任意一台主机执行以下命令测试:

mycli -h 192.168.11.25 -u root -p 123456 #ok
mycli -h 192.168.11.188 -u root -p 123456 #ok
mycli -h 192.168.11.186 -u root -p 123456 #ok

再次查看master主机的ip,发现虚拟ip不见了:

ip addr

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:64:35:17 brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.188/24 brd 192.168.11.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe64:3517/64 scope link
       valid_lft forever preferred_lft forever

此时查看slave主机的ip定, 发现ip漂移情况,虚拟ip自动绑定到到了slave主机上:

ip addr

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:f0:00:ad brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.186/24 brd 192.168.11.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.11.25/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fef0:ad/64 scope link
       valid_lft forever preferred_lft forever

此时查看slave主机情况,Slave_IO_Running变成了Connecting:

mycli -h 192.168.11.186 -u root -p 123456
show slave statusG;

Slave_IO_Running | Connecting
Slave_SQL_Running | Yes

继续测试

现在把master重新启动

mycli -h 192.168.11.188 -u root -p 123456 #ok
show master status;
+------------------+----------+--------------+-------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB              | Executed_Gtid_Set |
+------------------+----------+--------------+-------------------------------+-------------------+
| mysql-bin.000009 | 154      |              | mysql,test,information_schema |                   |
+------------------+----------+--------------+-------------------------------+-------------------+
1 row in set
Time: 0.004s

会发现信息发生了改变,再次查看slave的状态恢复正常:

Slave_IO_Running | Yes
Slave_SQL_Running | Yes

继续查看master主机发现未绑定vip,vip依然存在于slave所属主机上面。

那么现在把slave停掉试试看:

docker stop mysql-slave

mycli -h 192.168.11.186 -u root -p 123456 #error
mycli -h 192.168.11.25 -u root -p 123456 # error
mycli -h 192.168.11.188 -u root -p 123456 # ok

出现只有master主机的mysql服务能访问的情况,是因为上面测试把两个mysql服务停止,脚本监测不到3306端口执行了/etc/init.d/keepalived stop,所以需要重新启动keepalived :

# master主机
sudo /etc/init.d/keepalived start

# slave主机
docker start mysql-slave
sudo /etc/init.d/keepalived start

这个时候发现vip又重新绑定到master上面,OK,一切正常。

总结

写的可能有些啰嗦,但是每一步的操作和测试又是必要的,只为记录自己的一次学习心得。

如何连接远程mysql数据库

前言

最近买了个滴滴云,在上面装了wordpress,想看到数据库的内容,虽然可以直接用命令行的方式来看,但是实在是不友好,因此想用小海豚在本地连接远程数据库,实现增删改查。

赋予数据库账号远程连接的权限

首先用xshell登陆到vps,进入到数据库命令行:

mysql -u root -p

接着输入密码

执行:

grant all  on 数据库名.* to 用户名@'%' identified by 用户密码;

%代表的是全部IP都可访问。

扩展:

grant用法
    grant 权限 on 数据库.* to 用户名@'登录主机' identified by '密码'
权限:
    常用总结, ALL/ALTER/CREATE/DROP/SELECT/UPDATE/DELETE
数据库:
     *.*                    表示所有库的所有表
     test.*                表示test库的所有表
     test.test_table  表示test库的test_table表     
用户名:
     mysql账户名
登陆主机:
     允许登陆mysql server的客户端ip
     '%'表示所有ip
     'localhost' 表示本机
     '192.168.10.2' 特定IP
密码:
      账户对应的登陆密码

开放VPS的安全组策略

这步很重要,前面我一直连接不上就是因为这个原因,每个VPS厂商都有自己的安全组策略,什么是安全组策略呢,就是开放允许访问的端口,端口不通的话,流量是没办法进出的,那么也就没办法访问了。

那么我们去具体的VPS厂商的网站去更改安全组,开放数据库的端口即可,如果你没特殊设置的话,一般是3306。

mysql数据库导入导出

mysql数据库导入导出整理。

1. 数据库导入

mysql -uroot -p123456 --default-character-set=utf8 liuyj_ctisd < liuyj_ctisd.sql

2. 数据库导出

导出整个数据库

mysqldump -uroot -p123456 liuyj_ctisd > liuyj_ctisd.sql

导出数据库单表

mysqldump -uroot -p123456 liuyj_ctisd log> liuyj_ctisd_log.sql

导出数据库表结构

mysqldump -uroot -p123456 -d --add-drop-table liuyj_ctisd> liuyj_ctisd.sql

-d  导出空表
--add-drop-table 每个数据表创建之前添加drop数据表语句

3. 问题记录

mysqldump在命令行导出时,如果输入密码,提示如下警告信息(已执行成功,只是会提示警告信息)

Warning: Using a password on the command line interface can be insecure.

3.1.修复方法

  • 在命令行导出时,手动输入密码
  • 在/etc/mysql/my.cnf文件最后追加
[mysqldump]
user=user_name
password=password