使用 Nginx 实例组实现 CDN 外部源站

2020 年 2 月 25 日 谷歌开发者

文 / Google Cloud 技术工程师 于有志


2 月 27 日 15:00-16:00,Google Cloud 技术工程师吴斌将面向开发者进行线上直播培训课程,为您解读如何借助 Google Cloud 强大的云端服务,让数据驱动决策?可在次条预约观看直播。

本文将介绍如何在 Google Cloud 上创建 一个 Nginx 反向代理实例组,实现 Google Cloud CDN 回源到外部源站。


本文的配置主要基于下面架构:


文中将介绍的配置主要分为以下几个部分:
  • 创建配置文件存储桶
  • 创建模板虚机实例
  • 创建自定义镜像
  • 创建实例模板
  • 创建托管实例组
  • 创建负载均衡和 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 实例,用来制作实例组的模板。


在实例创建完毕后,点击“SSH”按钮登录到虚机命令行。


运行以下命令,安装 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”前面的注释符去掉。


运行下面的命令,将之前创建的存放配置文件的存储桶挂载到本地目录。

mkdir ~/gcs
gcsfuse -o allow_other cdn-proxy-config /home/eugeneyu/gcs


运行下面的命令,确认可以访问到存储桶上的配置文件。


运行下面命令,将可使用的文件句柄上限提高。

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,增加最大连接数,并将反向代理配置文件导入。


运行下面命令重启 Nginx:

sudo service nginx restart


测试 Nginx 代理访问源站资源是否成功。请将下面地址中的 IP 替换成 Nginx 服务器的公网 IP,将文件路径替换成源站测试文件的路径。

curl -X GET http://35.198.234.55/do_not_delete/test.txt



创建自定义镜像

基于 Nginx 服务器系统盘创建自定义镜像。



创建实例模板

镜像创建好后,创建一个 Instance Template。修改以下配置:
1. “Machine type”根据需要选择 2 vCPUs 或者 4 vCPUs 机型;
2. 修改“Boot disk”配置,选择刚刚创建好的镜像;

3. “Firewall”勾选”Allow HTTP traffic”和”Allow HTTPS traffic”;
4. “Networking”中的“Network tags”填写“cdn-proxy”;

5. Management 中的 Startup script 中填入以下内容,确保新实例启动时自动挂载配置文件存储桶,并增加文件句柄上限。

配置好后,点击“Create”按钮创建模板。



创建托管实例组

创建实例组。修改以下配置。

  1. Location 选择 Multiple zones
  2. Region 选择离源站最近的区域,比如新加坡为 asia-southeast1
  3. Instance template 选择上一步创建好的模板
  4. Minimum number of instances 根据预估用量选择机器数量,比如 5000 QPS 可以选择 5 台
  5. Health check 创建一个 80 端口的健康检查,各项配置采用默认值


配置好后,点击“Create”按钮创建实例组。



创建负载均衡和 CDN

  • 选择 HTTP(S) Load Balancing


  • Backend Configuration 选择 Create a backend service


  • 在新建的 Backend service 配置中选择之前创建的 Instance group,勾选“Enable Cloud CDN”,并选择之前创建的 HTTP 健康检查。


  • 在 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!'



登录查看更多
0

相关内容

Nginx(发音同 engine x)是一款由俄罗斯程序员 Igor Sysoev 所开发轻量级的网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。Nginx相较于 Apache、lighttpd 具有占有内存少,稳定性高等优势,并且依靠并发能力强,丰富的模块库以及友好灵活的配置而闻名。
【2020新书】实战R语言4,323页pdf
专知会员服务
100+阅读 · 2020年7月1日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
【电子书】Flutter实战305页PDF免费下载
专知会员服务
22+阅读 · 2019年11月7日
知识图谱本体结构构建论文合集
专知会员服务
106+阅读 · 2019年10月9日
通过Docker安装谷歌足球游戏环境
CreateAMind
11+阅读 · 2019年7月7日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
浅谈 Kubernetes 在生产环境中的架构
DevOps时代
11+阅读 · 2019年5月8日
支持多标签页的Windows终端:Fluent 终端
Python程序员
7+阅读 · 2019年4月15日
百度开源项目OpenRASP快速上手指南
黑客技术与网络安全
5+阅读 · 2019年2月12日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
Arxiv
20+阅读 · 2019年11月23日
Arxiv
6+阅读 · 2018年5月18日
Arxiv
14+阅读 · 2018年4月18日
VIP会员
相关VIP内容
相关资讯
通过Docker安装谷歌足球游戏环境
CreateAMind
11+阅读 · 2019年7月7日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
浅谈 Kubernetes 在生产环境中的架构
DevOps时代
11+阅读 · 2019年5月8日
支持多标签页的Windows终端:Fluent 终端
Python程序员
7+阅读 · 2019年4月15日
百度开源项目OpenRASP快速上手指南
黑客技术与网络安全
5+阅读 · 2019年2月12日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
Top
微信扫码咨询专知VIP会员