使用nginx反向代理负载均衡做免费稳定的markdown图床

作者: singworld 分类: markdown 发布时间: 2019-04-09 19:00

起因

前段时间使用GitHub Pages + hexo搭建了一个博客,但同时又想转到别的平台上
使用markdown写作,图片一直都是最头疼的事情,使用本地图片,各种不方便,不管是上传还是加载的体验都不是很好,然后就开始考虑用图床

图床挑选

之前我挺喜欢用Sina图床的,选图床这种事情,千万别选个人或小企业做的,你文章的图片基本上要永久保存的,个人和小企业的能维持三五年就已经很良心了,而且图床和网盘一样没什么盈利点,大厂有出现关停或者白名单访问,所以最靠谱的选择还是上私有云,云服务器成本很高,搭建属于自己的图床也完全没有必要,最关键的是自己建图床站,我有预感最多三五年也会选择关闭

图床最佳选择

QQ20190409-174020.png

通过不断爬贴,找到了最佳的解决方案——对象存储,对象存储的成本较云服务器来说成本很低,而且不臃肿更专注存储,最关键的是各大厂都提供来一定的免费额度
七牛云对象存储(共10G免费存储空间,每月10G免费下载流量,平均每天341M,很多人用,应该也是长期有效)
腾讯云对象存储(共50G免费存储空间,每月10G免费下载流量,平均每天341M,这个听说新用户免费有时间限制了,老用户暂时没变)
又拍云对象存储(共10G存储空间,每月15G流量,平均每天512M,长期有效,每年会送67元)
Ucloud对象存储(共20G免费存储空间,每个区每月20G免费下载流量,开北上广三个区,加起来就有60G免费下载流量)
青云QingCloud对象存储(共30G存储空间,每个区每月11G免费下载流量,每个用户可以建两个区的桶,每个区分别就11G免费下载流量,这个免费额度只有12个月,12个月后正常收费。)
QingCloud要先在右上角选择区域,然后在左侧面板中选择存储——对象存储,然后新建桶,新建桶后要记得右击——设置,然后在访问控制里添加一个所有用户可读权限,否则无法访问图片

网易云对象存储(共50G免费存储空间,每月20G免费下载流量,平均每天682M,需要实名才能使用然而现在个人实名被关了,可以观望一段时间)

配置nginx图片服务器

看到很多人都是用一个云的对象存储来搭建自己的图床,比如用腾讯云50G存储,每月10G流量,正常使用是足够了,但咸鱼还是要有梦想,如果忽然有一天某一篇文章阅读10W+还不得把自己整破产,开玩笑 其实使用多个云负载除了可以减轻成本,而且可以降低风险完善体验。某个免费存储可能某天会变更收费模式或者倒闭或者抽风宕机,使用负载均衡都能很好但为你规避风险

如代码所示,代码中有10个反向代理服务器(server)+1个负载均衡(upstream)组成:
– 由图片服务器提供一个图片域名https://img.jianxiaoxin.com/
– 图片服务器使用proxy_pass http://image_server; 反向代理到负载均衡upstream模块。
– upstream再按权重把请求分配到9个图片反代服务器中的一个。
– 反代服务器再把upstream分配的请求反代真正的某个云对象存储服务器,获取图片,再依次返回。
以宝塔面板为例

  1. 新建一个站点绑定图片服务器域名
  2. 点击网站管理找到图片服务器那个网站点击设置,修改配置文件为如下代码
  3. 重启nginx

下面是我的配置涉及到域名的要改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#图片反向代理服务器1-Qiniu
server {
listen unix:/var/tmp/img_server1.sock;
server_name localhost;
error_log /www/wwwlogs/img_server1.error.log error;
access_log /www/wwwlogs/img_server1.access.log combined;

location / {
proxy_pass http://image.jianxiaoxin.com/;
}
}

#图片反向代理服务器2-Upyun
server {
listen unix:/var/tmp/img_server2.sock;
server_name localhost;
error_log /www/wwwlogs/img_server2.error.log error;
access_log /www/wwwlogs/img_server2.access.log combined;

location / {
proxy_pass https://upimg.jianxiaoxin.com/;
}
}

#图片反向代理服务器3-Netease
server {
listen unix:/var/tmp/img_server3.sock;
server_name localhost;
error_log /www/wwwlogs/img_server3.error.log error;
access_log /www/wwwlogs/img_server3.access.log combined;

location / {
proxy_pass http://markdown-bucket.nos-eastchina1.126.net/;
}
}

#图片反向代理服务器4-Tecent
server {
listen unix:/var/tmp/img_server4.sock;
server_name localhost;
error_log /www/wwwlogs/img_server4.error.log error;
access_log /www/wwwlogs/img_server4.access.log combined;

location / {
proxy_pass https://singworld-1253240475.cos.ap-beijing.myqcloud.com/;
}
}

#图片反向代理服务器5-Ucloud 广东
server {
listen unix:/var/tmp/img_server5.sock;
server_name localhost;
error_log /www/wwwlogs/img_server5.error.log error;
access_log /www/wwwlogs/img_server5.access.log combined;

location / {
proxy_pass http://ucgzimg.jianxiaoxin.com/;
}
}

#图片反向代理服务器6-Ucloud-bj
server {
listen unix:/var/tmp/img_server6.sock;
server_name localhost;
error_log /www/wwwlogs/img_server6.error.log error;
access_log /www/wwwlogs/img_server6.access.log combined;

location / {
proxy_pass http://ucbjimg.jianxiaoxin.com/;
}
}

#图片反向代理服务器7-Ucloud-sh2
server {
listen unix:/var/tmp/img_server7.sock;
server_name localhost;
error_log /www/wwwlogs/img_server7.error.log error;
access_log /www/wwwlogs/img_server7.access.log combined;

location / {
proxy_pass http://ucshimg.jianxiaoxin.com/;
}
}

#图片反向代理服务器8-QingCloud-gd2
server {
listen unix:/var/tmp/img_server8.sock;
server_name localhost;
error_log /www/wwwlogs/img_server8.error.log error;
access_log /www/wwwlogs/img_server8.access.log combined;

location / {
proxy_pass http://qcgzimg.jianxiaoxin.com/;
}
}

#图片反向代理服务器9-QingCloud-bj3
server {
listen unix:/var/tmp/img_server9.sock;
server_name localhost;
error_log /www/wwwlogs/img_server9.error.log error;
access_log /www/wwwlogs/img_server9.access.log combined;

location / {
proxy_pass http://qcbjimg.jianxiaoxin.com;
}
}

#负载均衡 weight是使用权重可以根据个人情况调节或关闭 weight = 某云日流量/所有云日总流量
upstream image_server {
#Qiniu => 每月10G免费下载流量,每天341M 总3478
server unix:/var/tmp/img_server1.sock weight=8;
#Upyun=>每月15G免费下载流量,每天512M
server unix:/var/tmp/img_server2.sock weight=1;
#Netease=>每月20G免费下载流量,每天682M
#server unix:/var/tmp/img_server3.sock weight=18;
#Tecent=>每月10G免费下载流量,每天341M
server unix:/var/tmp/img_server4.sock weight=9;
#Ucloud-gz=>每月20G免费下载流量,每天682M
server unix:/var/tmp/img_server5.sock weight=20;
#Ucloud-bj=>每月20G免费下载流量,每天682M
server unix:/var/tmp/img_server6.sock weight=20;
#Ucloud-sh2=>每月20G免费下载流量,每天682M
server unix:/var/tmp/img_server7.sock weight=20;
#QingCloud-gd2=>每月11G免费下载流量,每天375M
server unix:/var/tmp/img_server8.sock weight=11;
#QingCloud-bj3=>每月11G免费下载流量,每天375M
server unix:/var/tmp/img_server9.sock weight=11;
}


server
{
listen 80;
listen 443 ssl http2;
server_name img.jianxiaoxin.com;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/img.jianxiaoxin.com;

#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
#HTTP_TO_HTTPS_START
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END
ssl_certificate /etc/letsencrypt/live/img.jianxiaoxin.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/img.jianxiaoxin.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;

#SSL-END

#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
error_page 404 /404.html;
error_page 502 /502.html;
#ERROR-PAGE-END

#PHP-INFO-START PHP引用配置,可以注释或修改
include enable-php-72.conf;
#PHP-INFO-END

#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/img.jianxiaoxin.com.conf;
#REWRITE-END

#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
{
return 404;
}

#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}


access_log /www/wwwlogs/img.jianxiaoxin.com.log;
error_log /www/wwwlogs/img.jianxiaoxin.com.error.log;

#请求转发到image_server定义的服务器列表
location / {
proxy_pass http://image_server;
proxy_set_header Host localhost;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}


图片上传

那么多个对象存储,每一张图片都要重复上传 那怎么行
推荐两种方式
方法一:批量上传插件,一键盘上传多个云并自动返回markdown格式图片
工具开源项目并且本文也是参考本开源项目编写 https://github.com/xiebruce/PicUploader/
方法二:使用镜像回源
使用方式1,因为图片要所有云都上传获取链接速度较慢
使用方式2,如果源存储挂了可能导致图片无法方法甚至图片丢失
建议两种搭配使用

Leave a Reply

Your email address will not be published. Required fields are marked *