文 / Google Cloud 技术工程师 于有志
![8e73d6c83d174651482a83592de90100.png](https://i-blog.csdnimg.cn/blog_migrate/80092cc4346d6808ef920b236694473e.jpeg)
2 月 27 日 15:00-16:00,Google Cloud 技术工程师吴斌将面向开发者进行线上直播培训课程,为您解读如何借助 Google Cloud 强大的云端服务,让数据驱动决策?可在次条预约观看直播。
本文将介绍如何在 Google Cloud 上创建 一个 Nginx 反向代理实例组,实现 Google Cloud CDN 回源到外部源站。本文的配置主要基于下面架构:
![5067adef38a95f5727a3d48a6ef91d21.png](https://i-blog.csdnimg.cn/blog_migrate/6152abbfdf768a1895895c5c759e4c58.jpeg)
- 创建配置文件存储桶
- 创建模板虚机实例
- 创建自定义镜像
- 创建实例模板
- 创建托管实例组
- 创建负载均衡和 CDN
修改和更新代理配置
创建配置文件存储桶
首先创建一个 Cloud Storage 的存储桶,用来存放代理服务器配置文件。
在本地创建一个名为 nginx-proxy-config.conf 的配置文件,并上传到存储桶。配置文件的内容如下,注意将回源域名改为实际使用的域名:
server {
listen 80;
server_name ~^(.+)$;
gzip on;
gzip_proxied any;
location / {
access_log /var/log/nginx/upstream.log;
add_header Cache-Control "public, max-age=604800";
proxy_http_version 1.1;
proxy_pass https://xxx.s3.amazonaws.com/;
}
}
创建模板虚机实例
创建一个 GCE VM 实例,用来制作实例组的模板。
![f63b96361c673b4113b3f233a57c0537.png](https://i-blog.csdnimg.cn/blog_migrate/ccd3b7019b9aaeb216131d148540bc75.jpeg)
在实例创建完毕后,点击“SSH”按钮登录到虚机命令行。
![0a418604245a48f85af31a2440b9fde8.png](https://i-blog.csdnimg.cn/blog_migrate/969e37e5cf3255548d2fe68567b8d3dd.png)
运行以下命令,安装 gcsfuse。
export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s`
echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install gcsfuse
修改 /etc/fuse.conf,将”user_allow_other”前面的注释符去掉。
![10d090594cc06c0b9b39fcadddf61461.png](https://i-blog.csdnimg.cn/blog_migrate/5c5b8de199d0e238baf8474d060c35d8.png)
运行下面的命令,将之前创建的存放配置文件的存储桶挂载到本地目录。
mkdir ~/gcs
gcsfuse -o allow_other cdn-proxy-config /home/eugeneyu/gcs
运行下面的命令,确认可以访问到存储桶上的配置文件。
![6695fb271aa52a2804ae95db494985b2.png](https://i-blog.csdnimg.cn/blog_migrate/49468d7c6d0218c1af5e874c2822ac42.png)
运行下面命令,将可使用的文件句柄上限提高。
sudo su -
ulimit -n 99999
echo "fs.file-max=99999" >> /etc/sysctl.conf
echo "* soft nofile 99999" >> /etc/security/limits.conf
echo "* hard nofile 99999" >> /etc/security/limits.conf
exit
运行以下命令,安装 Nginx 服务。
sudo apt-get update
sudo apt-get install -y nginx
修改 Nginx 的主配置文件 /etc/nginx/nginx.conf,增加最大连接数,并将反向代理配置文件导入。
![61515f83c5f7b6c6e8a7876936859029.png](https://i-blog.csdnimg.cn/blog_migrate/75d0cd894d3e740a71e556788f21f516.png)
![afe51a1243a435c96f5f7f5269dc5d0c.png](https://i-blog.csdnimg.cn/blog_migrate/1d921391001a1f0542c1b2127c73bf11.png)
运行下面命令重启 Nginx:
sudo service nginx restart
测试 Nginx 代理访问源站资源是否成功。请将下面地址中的 IP 替换成 Nginx 服务器的公网 IP,将文件路径替换成源站测试文件的路径。
curl -X GET http://35.198.234.55/do_not_delete/test.txt
创建自定义镜像
基于 Nginx 服务器系统盘创建自定义镜像。
![11b42c6808fb6d0441ba2ed88e43d451.png](https://i-blog.csdnimg.cn/blog_migrate/eae6fda20d295a62ba72191c80e3bf53.jpeg)
创建实例模板
镜像创建好后,创建一个 Instance Template。修改以下配置:1. “Machine type”根据需要选择 2 vCPUs 或者 4 vCPUs 机型;2. 修改“Boot disk”配置,选择刚刚创建好的镜像;5. Management 中的 Startup script 中填入以下内容,确保新实例启动时自动挂载配置文件存储桶,并增加文件句柄上限。
![bf9831d3c571d8463fcfda10c2224456.png](https://i-blog.csdnimg.cn/blog_migrate/97902ee392707f2c89391e3f3ac0879e.png)
配置好后,点击“Create”按钮创建模板。
创建托管实例组
创建实例组。修改以下配置。
- Location 选择 Multiple zones
- Region 选择离源站最近的区域,比如新加坡为 asia-southeast1
- Instance template 选择上一步创建好的模板
- Minimum number of instances 根据预估用量选择机器数量,比如 5000 QPS 可以选择 5 台
Health check 创建一个 80 端口的健康检查,各项配置采用默认值
![fdd332e41394a27c4a82cccf1092738e.png](https://i-blog.csdnimg.cn/blog_migrate/240a0515cbd7e55c2d97d0e4b69118c1.jpeg)
配置好后,点击“Create”按钮创建实例组。
创建负载均衡和 CDN
选择 HTTP(S) Load Balancing
![3969edf418a02cc0f80b94ac0cc35929.png](https://i-blog.csdnimg.cn/blog_migrate/516039459f6992435b8c383bd2ddcf4f.png)
Backend Configuration 选择 Create a backend service
![320bc7989c26d84fec5054fa137d36b1.png](https://i-blog.csdnimg.cn/blog_migrate/407f22444940f29f1ce79d3969d86912.png)
在新建的 Backend service 配置中选择之前创建的 Instance group,勾选“Enable Cloud CDN”,并选择之前创建的 HTTP 健康检查。
![0291ed49730fd3797ff014a1e654d99f.png](https://i-blog.csdnimg.cn/blog_migrate/dc30f07817b4919fd490565798f77b0d.jpeg)
在 Frontend configuration 中的 IP address 选择 Create IP address,创建一个固定公网地址用于 CDN 前端访问地址。
配置好后,点击“Create”按钮创建负载均衡和 CDN。
负载均衡和 CDN 大概需要 15-20 分钟初始化。之后可以访问相关文件进行测试。
修改和更新代理配置
如果源站域名等配置需要修改,可以更新 Nginx 代理配置,重新上传到配置存储桶覆盖之前文件,并用以下脚本将实例组中所有实例的 Nginx 运行 reload 更新配置。
#!/bin/bash
# Example: ./nginx_reload.sh mig_nginx
mig_nginx='mig-cdn-proxy-india-v8'
region=asia-south1
if [ "$1" != "" ]; then
mig_nginx=$1
fi
instance_array=( $(gcloud compute instance-groups list-instances --region=$region $mig_nginx | cut -d" " -f1) )
total_instances=$(expr ${#instance_array[@]} - 1)
if [ ${#instance_array[@]} -eq 0 ]; then
echo "Instance Group doesn't exist or is empty!"
exit
else
echo "Instance Group has $total_instances instances"
fi
for (( i=1; i<=$(( ${#instance_array[@]} )) - 1; i++ ))
do
echo -n "Reload Nginx config file on ${instance_array[i]}..."
gcloud compute ssh ${instance_array[i]} --command="sudo service nginx reload"
done
echo -e '\nDone!'