使用 iptables 模拟网络故障

1. 前言

前一阵子线上程序出了一个 Downtime,原来同事写的一段代码中间在读写 Redis 的时候没有做好异常处理。在关键流程上面因为读写 Redis 异常直接退出了,导致后续的流程没有处理完。

解决方法也很简单,从业务逻辑入手在读写失败的时候进行重试和降级即可。可是怎么模拟网络故障进行测试呢?

下面就要轮到 iptables 上场了。

2. 使用 iptables 模拟故障

使用 iptables 来模拟网络故障的时候,我们针对 Redis 写入进行处理。简单来说就是在 Redis Server 端口 OUTPUT 的网络包分别进行 REJECT 和 DROP 操作。

sudo iptables -D OUTPUT -p tcp --destination-port 22368 -j REJECT
sudo iptables -D OUTPUT -p tcp --destination-port 22368 -j DROP

异常信息:

Caused by: java.net.SocketTimeoutException: connect timed out
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at redis.clients.jedis.Connection.connect(Connection.java:184)

测试过后虽然 Redis 写入数据有问题,但是主流程能够正常跑完,这就 OK 了。

WordPress 开启 HTTPS

1. 基本思路

  1. 使用 certbot 来申请和维护证书(参见 Nginx on Ubuntu 18.04 LTS (bionic)
  2. 使用 Really Simple SSL 插件

2. 操作过程

2.1 安装 Certbot 与使用

# 1. 安装
apt-get update
apt-get install software-properties-common
add-apt-repository universe
add-apt-repository ppa:certbot/certbot
apt-get update
apt-get install certbot python3-certbot-nginx

# 2. 申请证书
certbot --nginx

# 3. 刷新证书
certbot renew

2.2 Nginx 配置

如果我们的 Nginx 服务器配置了多个域名就可能会把 Nginx 配置拆分到多个文件,比如 /etc/nginx/conf.d/note4code.com.conf

upstream wordpress {
  server 127.0.0.1:8000;
}

server {
  listen          443;
  ssl on;
  ssl_certificate /etc/letsencrypt/live/note4code.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/note4code.com/privkey.pem;
  server_name     note4code.com www.note4code.com;
  access_log      /root/logs/ngxin/note4code.com.access.log;

  location / {
    proxy_pass        http://wordpress/;
    proxy_set_header  Host              $host;
    proxy_set_header  X-Real-IP         $remote_addr;
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
  }
}

server {
  listen          80;
  #return          301 https://$server_name$request_uri;
  server_name     www.note4code.com note4code.com;
  access_log      /root/logs/ngxin/note4code.com.access.log;

  location / {
    proxy_pass        http://wordpress/;
    proxy_set_header  Host             $host;
    proxy_set_header  X-Real-IP        $remote_addr;
    proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
  }
}

3. 要解决的问题

即使我们配置了 HTTPS 证书和 Nginx 配置文件,在我们打开页面的时候地址栏左侧依然没有安全连接的标志。

这是因为 WordPress 的部分代码中依然引用了 HTTP 的非安全资源,尝试了网上给出的很多方法,比如修改 WordPress 里面的函数等效果都不太好。

但其实最简单的方法其实就是使用 Really Simple SSL 插件。不需要付费版,免费版就足够使用了。

image-20200525151548639