分类 📄 WebOps 下的文章

1 下载安装包

curl -o /tmp/nginx-1.21.0-with-third-module.zip https://oss.iuskye.com/article/2021-08-15/nginx-1.21.0-with-third-module.zip

2 解压并打补丁

cd /tmp
unzip nginx-1.21.0-with-third-module.zip
yum install patch -y
cd nginx-1.21.0/
patch -p1 < ../ngx_http_proxy_connect_module-master/patch/proxy_connect_rewrite_1018.patch

3 编译安装

install_dir=/opt

./configure \
--prefix=${install_dir}/nginx \
--sbin-path=${install_dir}/nginx/sbin/nginx \
--conf-path=${install_dir}/nginx/conf/nginx.conf \
--error-log-path=${install_dir}/nginx/log/error.log \
--http-log-path=${install_dir}/nginx/log/access.log \
--pid-path=${install_dir}/nginx/nginx.pid \
--lock-path=${install_dir}/nginx/nginx.lock \
--user=mbs \
--group=mbs \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=${install_dir}/nginx/client/ \
--http-proxy-temp-path=${install_dir}/nginx/proxy/ \
--http-fastcgi-temp-path=${install_dir}/nginx/fcgi/ \
--http-uwsgi-temp-path=${install_dir}/nginx/uwsgi \
--http-scgi-temp-path=${install_dir}/nginx/scgi \
--with-stream \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-stream_realip_module \
--with-http_realip_module \
--with-http_gunzip_module \
--with-http_degradation_module \
--with-mail \
--with-mail_ssl_module \
--with-http_slice_module \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_v2_module \
--with-http_secure_link_module \
--with-pcre-jit \
--with-http_sub_module \
--with-pcre=/tmp/nginx/pcre-8.37 \
--with-openssl=/tmp/nginx/openssl-1.1.1k \
--with-zlib=/tmp/nginx/zlib-1.2.11 \
--add-module=/tmp/nginx/nginx-upload-module-2.3.0 \
--add-module=/tmp/nginx/nginx_upstream_check_module-master \
--add-module=/tmp/nginx/headers-more-nginx-module-master \
--add-module=/tmp/nginx/ngx_http_proxy_connect_module-master \
--with-debug

cores=$(cat /proc/cpuinfo| grep "processor"| wc -l)
make -j $cores
make install

4 第三方模块展示

tree -L 1 -d
.
├── headers-more-nginx-module-master
├── nginx-1.21.0
├── nginx-upload-module-2.3.0
├── nginx_upstream_check_module-master
├── ngx_http_proxy_connect_module-master
├── openssl-1.1.1k
├── pcre-8.37
└── zlib-1.2.11

1 安装Mailx

yum install mailx -y

2 添加配置文件

vim /etc/mail.rc

# 企业邮箱地址
set from=test@test.com
# 腾讯企业邮箱发送服务器
set smtp=smtps://smtp.exmail.qq.com:465
# 企业邮箱地址
set smtp-auth-user=test@test.com
# 密码
set smtp-auth-password=123
# 验证方式
set smtp-auth=login
# 是否验证SSL证书
set ssl-verify=ignore
# 证书路径
set nss-config-dir=~/.certs

3 生成证书

mkdir ~/.certs
cd ~/.certs/
echo -n | openssl s_client -connect smtp.exmail.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > qq.crt
certutil -A -n 'GeoTrust SSL CA' -t 'C,,' -d ./ -i qq.crt
certutil -A -n 'GeoTrust Global CA' -t 'C,,' -d ./ -i qq.crt
certutil -L -d ./

为了防止出现前文所说的发送邮件警告提示,还需要进入邮箱 SSL 证书存放目录 ~/.certs 里执行如下命令:

certutil -A -n 'GeoTrust SSL CA – G3' -t 'Pu,Pu,Pu' -d ./ -i qq.crt

返回如下提示即可:

Notice: Trust flag u is set automatically if the private key is present.

4 测试验证

echo "ceshi" | mail -s "test" poc@126.com

全量同步

Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下: 

  • 从服务器连接主服务器,发送SYNC命令; 
  • 主服务器接收到SYNC命令后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
  • 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令; 
  • 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照; 
  • 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令; 
  • 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令; 

完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。

增量同步

Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。 

增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

Redis主从同步策略

主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。

其他

Redis 2.8以后提供了PSYNC优化了断线重连的效率。

安装前系统优化

echo 511 > /proc/sys/net/core/somaxconn
echo "echo 511 > /proc/sys/net/core/somaxconn" >> /etc/rc.d/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" >> /etc/rc.d/rc.local
echo 1 > /proc/sys/vm/overcommit_memory
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf

概念

官方文档

文档
GitHub

frp 是什么?

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

为什么使用 frp?

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。
  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。
  • 代理组间的负载均衡。
  • 端口复用,多个服务通过同一个服务端端口暴露。
  • 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。
  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。
  • 服务端和客户端 UI 页面。

原理

frp 主要由客户端(frpc)和服务端(frps)组成,服务端通常部署在具有公网 IP 的机器上,客户端通常部署在需要穿透的内网服务所在的机器上。

内网服务由于没有公网 IP,不能被非局域网内的其他用户访问。

用户通过访问服务端的 frps,由 frp 负责根据请求的端口或其他信息将请求路由到对应的内网机器,从而实现通信。

服务端安装配置

下载 FRP 安装包

在服务器上安装配置的前提条件是该服务器需要拥有一个公网IP地址。在 Github Release 页面下载最新的 Linux 版本:

https://github.com/fatedier/frp/releases

通过 SSH 登录到拥有公网 IP 地址的服务器上,我这里使用的是一台阿里云 ECS。

mkdir -p /opt/frp-server
cd /opt/frp-server
wget https://github.com/fatedier/frp/releases/download/v0.35.1/frp_0.35.1_linux_amd64.tar.gz
tar zxf frp_0.35.1_linux_amd64.tar.gz
mv frp_0.35.1_linux_amd64 frp
cd frp

配置

vim frps.ini

[common]
bind_port = 7000
token = frp2021

这里的 token 为你的明文密码,请自定义。

设置开机自启动:

cp systemd/frps.service /usr/lib/systemd/system/
vim /usr/lib/systemd/system/frps.service

修改启动路径:

ExecStart=/opt/frp-server/frp/frps -c /opt/frp-server/frp/frps.ini
systemctl daemon-reload
systemctl enable frps

启动服务:

systemctl start frps
ps -ef | grep frps
nobody    421370       1  1 12:27 ?        00:00:00 /opt/frp-server/frp/frps -c /opt/frp-server/frp/frps.ini

在阿里云控制的安全组配置中将7000端口开放:

这里还要说明下6022端口为即将开放的内网服务的远程端口,为了方便,在开放安全组端口的时候可以开放一组端口,例如6000-7000。

客户端配置

安装 CentOS7 虚拟机

在需要开放服务的同一网段内安装一台虚拟机用来搭建 FRP 的客户端,或者使用一台很低配置的小服务器也可,推荐安装 CentOS7.6。

安装配置

同理下载上述服务器配置中的url:

mkdir -p /opt/frp-client
cd /opt/frp-client
wget https://github.com/fatedier/frp/releases/download/v0.35.1/frp_0.35.1_linux_amd64.tar.gz
tar zxf frp_0.35.1_linux_amd64.tar.gz
mv frp_0.35.1_linux_amd64 frp
cd frp
vim frpc.ini

[common]
server_addr = 114.114.114.114
server_port = 7000
token = frp2021

[ssh]
type = tcp
local_ip = 192.168.0.102
local_port = 22
remote_port = 6022

注意事项:

  • server_addr后面配置的是服务器端公网IP或者域名(假设你解析了域名)
  • token 需要和服务器端配置的一样
  • 下面[ssh]配置段就是需要穿透的内网服务,这里以 FRP 这台服务器的22端口为例

设置开机自启动:

cp systemd/frpc.service /usr/lib/systemd/system/
vim /usr/lib/systemd/system/frpc.service

修改启动路径:

ExecStart=/opt/frp-client/frp/frpc -c /opt/frp-client/frp/frpc.ini
ExecReload=/opt/frp-client/frp/frpc reload -c /opt/frp-client/frp/frpc.ini
systemctl daemon-reload
systemctl enable frpc

启动服务:

systemctl start frpc
ps -ef | grep frpc
nobody    1650     1  0 23:49 ?        00:00:00 /opt/frp-client/frp/frpc -c /opt/frp-client/frp/frpc.ini

测试

接下来使用手机连接4/5G网络来通过那个公网IP地址的6022端口连接到内网服务器。