Skip to content

Commit e9a5b03

Browse files
committed
Nginx
1 parent 1da599c commit e9a5b03

2 files changed

Lines changed: 300 additions & 0 deletions

File tree

docs/nice-article/weixin/chaoynginxhcxydwebfwqyqlgyy.md

Lines changed: 300 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,300 @@
1+
---
2+
title: 超越 Nginx!号称下一代 Web 服务器,用起来够优雅!
3+
shortTitle: 超越 Nginx!号称下一代 Web 服务器,用起来够优雅!
4+
description: Github标星38K+,Web服务器后起之秀!
5+
author: 梦想de星空
6+
category:
7+
- 微信公众号
8+
head:
9+
- - meta
10+
- name: description
11+
content: Github标星38K+,Web服务器后起之秀!
12+
---
13+
14+
> Nginx是一款非常流行的Web服务器,在Github上已有`16K+Star`,我们经常用它来做静态资源托管或反向代理。最近发现了一款全新的Web服务器`Caddy`,Star数超越Nginx,标星`38K+Star`。试用了一下`Caddy`,发现它使用起来比Nginx优雅多了,功能也很强大,推荐给大家!
15+
16+
## Caddy简介
17+
18+
Caddy是一款功能强大,扩展性高的Web服务器,目前在Github上已有`38K+Star`。Caddy采用Go语言编写,可用于静态资源托管和反向代理。
19+
20+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyic9pYv5Rnk0XtbCCFCYH13siazfcQ0kWu730nOiab2RF7TvUZsuiaOC3Tw/640?wx_fmt=png)
21+
22+
Caddy具有如下主要特性:
23+
24+
* 对比Nginx复杂的配置,其独创的`Caddyfile`配置非常简单;
25+
* 可以通过其提供的`Admin API`实现动态修改配置;
26+
* 默认支持自动化HTTPS配置,能自动申请HTTPS证书并进行配置;
27+
* 能够扩展到数以万计的站点;
28+
* 可以在任意地方执行,没有额外的依赖;
29+
* 采用Go语言编写,内存安全更有保证。
30+
31+
## 安装
32+
33+
> 首先我们直接在CentOS 8上安装Caddy,使用DNF工具安装无疑是最简单的,Docker安装方式之后也会介绍。
34+
35+
* 使用如下命令通过DNF工具安装Caddy,安装成功后Caddy会被注册成系统服务;
36+
37+
```
38+
dnf install 'dnf-command(copr)'dnf copr enable @caddy/caddydnf install caddy
39+
```
40+
41+
* 使用`systemctl status caddy`查看Caddy的状态,可以发现Caddy已被注册为系统服务,但是还没开启。
42+
43+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyZ9DjgwxIf8WR8czpVgiakibIxelIEgDZahkTQGSBmAHkOgBeic6dHN2xw/640?wx_fmt=png)
44+
45+
## 使用
46+
47+
> 下面我们体验下Caddy的基本使用,对于Web服务器来说都是常用的操作,你准能用的上!
48+
49+
### 基本使用
50+
51+
> 首先我们来个Caddy的入门使用,让Caddy运行在`2015`端口上并返回`Hello, world!`
52+
53+
* 直接使用`caddy`命令将输出Caddy的常用命令,基本看介绍就知道如何使用了,标出来的是常用命令;
54+
55+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyJX5LicAxNDTianKTrMEjEAgVpibTjDAiapBYsbngSWDF9AxOFyGlLrScEA/640?wx_fmt=png)
56+
57+
* 使用`caddy start`命令可以让Caddy服务在后台运行;
58+
59+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyqB6JIia6ciaSU6qkJ4fuJHn2PTpwLn8VQmpoWx47ZPYOnjib2LIb0RT8g/640?wx_fmt=png)
60+
61+
* Caddy默认使用JSON格式的配置文件,但由于JOSN格式配置书写比较麻烦,又提供了`Caddyfile`这种更加简洁的配置形式,使用如下命令能自动把`Caddyfile`转化为JSON配置;
62+
63+
```
64+
caddy adapter
65+
```
66+
67+
* 我们可以先创建一个名称为`Caddyfile`的文件,文件内容如下,然后使用`caddy adapter`将它转换为JSON配置,再使用`caddy reload`使配置生效,该配置将监听`2015`端口,并返回`Hello, world!`
68+
69+
```
70+
:2015respond "Hello, world!"
71+
```
72+
73+
* 然后我们使用curl命令访问`localhost:2015`,将返回指定的信息;
74+
75+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyE1Lop7oCO9XA41rsV6rIx965KibCJVvxZvlcHmyBLugzNVwhMCZiclEA/640?wx_fmt=png)
76+
77+
* 当然我们还可以使用Caddy提供的`Admin API`来查看配置信息,使用如下命令即可;
78+
79+
```
80+
curl localhost:2019/config/
81+
```
82+
83+
* 当前JSON配置如下,如果你直接使用JSON配置的话需要书写如下配置,使用`Caddyfile`确实方便很多!
84+
85+
```
86+
{ "apps": {  "http": {   "servers": {    "srv0": {     "listen": [":2015"],     "routes": [{      "handle": [{       "body": "Hello, world!",       "handler": "static_response"      }]     }]    }   }  } }}
87+
```
88+
89+
### `Caddyfile`基本语法
90+
91+
* 下面案例将使用`Caddyfile`来进行配置,我们有必要了解下它的语法,`Caddyfile`的具体语法规则如下。
92+
93+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyNlfRVs45X1gmSoXRTfn92JAgITJGd9fnibmcDvVtSiaIjc9zCZbJd7iaA/640?wx_fmt=png)
94+
95+
* 介绍下上图中的关键字,有助于理解。
96+
97+
关键字|解释|使用|
98+
---|---|---|
99+
Global options block|服务器全局配置|可用于配置是否启用HTTPS和Admin API等|
100+
Snippet|可以复用的配置片段|定义好后认可以通过`import`关键字引用|
101+
Site Block|单个网站配置|通过`file_server`可以配置静态代理,通过`reverse_proxy`可以配置动态代理|
102+
Matcher definition|匹配定义|默认情况下指令会产生全局影响,通过它可以指定影响范围|
103+
Comment|注释|使用`#`符号开头|
104+
Site address|网站地址|默认使用HTTPS,如需开启HTTP,需要指定`http://`开头|
105+
Directive|指令|指令赋予了Caddy强大的功能|
106+
107+
### 反向代理
108+
109+
> 反向代理就是当请求访问你的代理服务器时,代理服务器会对你的请求进行转发,可以转发到静态的资源路径上去,也可以转发到动态的服务接口上去。下面我们以对域名进行代理为例,来讲讲如何进行静态代理和动态代理。
110+
111+
#### 静态代理
112+
113+
> 静态代理就是将请求代理到不同的静态资源路径上去,这里我们将对`docs.macrozheng.com`的请求代理到我的文档项目中,对`mall.macrozheng.com`的请求代理到mall的前端项目中。
114+
115+
* 首先我们修改下本机的host文件:
116+
117+
```
118+
192.168.3.106 docs.macrozheng.com192.168.3.106 mall.macrozheng.com
119+
```
120+
121+
* 然后将我们的文档项目和mall前端项目上传到Caddy的html目录中去,并进行解压操作:
122+
123+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWykpHD5r6oUasglvK4BgicubLewfpZyEMthIfvv0LCrCaFbcIxKr1u8Mw/640?wx_fmt=png)
124+
125+
* 修改`Caddyfile`文件,使用如下配置,修改完成后使用`caddy reload`命令刷新配置;
126+
127+
```
128+
http://docs.macrozheng.com {        root * /mydata/caddy/html/docs        file_server browse}http://mall.macrozheng.com {        root * /mydata/caddy/html/mall        file_server browse}
129+
```
130+
131+
* 如果你的`Caddyfile`文件格式不太合格的话,会出现如下警告,直接使用`caddy fmt --overwrite`格式化并重写配置即可解决;
132+
133+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyzz5efViac36b9ic6icuPunQoZqnrLqvGicwWrW1r7p9vrFFSB9wRTtboTg/640?wx_fmt=png)
134+
135+
* 通过`docs.macrozheng.com`即可访问部署好的文档项目了:
136+
137+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyGNcrBssiaTMiaC9kI1JichCnqr2bUS6mXHT9icxvr7Bkh77sAMIDxZXzTQ/640?wx_fmt=png)
138+
139+
* 通过`mall.macrozheng.com`即可访问到部署好的前端项目了。
140+
141+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyeot4SMTibs5UxhuQBx4oyz0O9jbnbTNOoOKypsZD9vepWSsF0CwqYQA/640?wx_fmt=png)
142+
143+
#### 动态代理
144+
145+
> 动态代理就是把代理服务器的请求转发到另一个服务上去,这里我们将把对`api.macrozheng.com`的请求代理到演示环境的API服务上去。
146+
147+
* 首先我们修改下本机的host文件,添加如下规则:
148+
149+
```
150+
192.168.3.106 api.macrozheng.com
151+
```
152+
153+
* 修改`Caddyfile`文件,使用如下配置,修改完成后使用`caddy reload`命令刷新配置;
154+
155+
```
156+
http://api.macrozheng.com {        reverse_proxy http://admin-api.macrozheng.com}
157+
```
158+
159+
* 之后通过`api.macrozheng.com/swagger-ui.html`即可访问到`mall-admin`的API文档页面了。
160+
161+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyjezYsLibVetwblI1bL541QIxgGFBIBSmggFZrKj4OBXRFUuQabhrXqg/640?wx_fmt=png)
162+
163+
### 文件压缩
164+
165+
> 如果我们的服务器带宽比较低,网站访问速度会很慢,这时我们可以通过让Caddy开启Gzip压缩来提高网站的访问速度。这里我们以mall的前端项目为例来演示下它的提速效果。
166+
167+
* 我们需要修改`Caddyfile`文件,使用`encode`指令开启Gzip压缩,修改完成后使用`caddy reload`命令刷新配置;
168+
169+
```
170+
http://mall.macrozheng.com {        root * /mydata/caddy/html/mall        encode {            gzip        }        file_server browse}
171+
```
172+
173+
* 有个比较大的JS文件压缩前是`1.7M`
174+
175+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWy5Et1W6kialSkXGVor1mDx4I35uibiaCV2jI3yp0mbUDvnL6dPIqHd68aA/640?wx_fmt=png)
176+
177+
* 压缩后为`544K`,访问速度也有很大提示;
178+
179+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyPrX5AKdbdetLJddlI0oSgib9MKe4xA1yoswfcEnQd27TW1ZtKr7b0tQ/640?wx_fmt=png)
180+
181+
* 另外我们可以看下响应信息,如果有`Content-Encoding: gzip`这个响应头表明Gzip压缩已经启用了。
182+
183+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyoA9E03ABUgHCOz0CI3sc5YnB9m3iaXOHwCmKQGVWH5icbwRwBMNTvN3Q/640?wx_fmt=png)
184+
185+
### 地址重写
186+
187+
> 有的时候我们的网站更换了域名,但还有用户在使用老的域名访问,这时可以通过Caddy的地址重写功能来让用户跳转到新的域名进行访问。
188+
189+
* 我们需要修改`Caddyfile`文件,使用`redir`指令重写地址,修改完成后使用`caddy reload`命令刷新配置;
190+
191+
```
192+
http://docs.macrozheng.com {        redir http://www.macrozheng.com}
193+
```
194+
195+
* 此时访问旧域名`docs.macrozheng.com`会直接跳转到`www.macrozheng.com`去。
196+
197+
### 按目录划分
198+
199+
> 有时候我们需要使用同一个域名来访问不同的前端项目,这时候就需要通过子目录来区分前端项目了。
200+
201+
* 比如说我们需要按以下路径来访问各个前端项目;
202+
203+
```
204+
www.macrozheng.com #访问文档项目www.macrozheng.com/admin #访问后台项目www.macrozheng.com/app #访问移动端项目
205+
```
206+
207+
* 我们需要修改`Caddyfile`文件,使用`route`指令定义路由,修改完成后使用`caddy reload`命令刷新配置。
208+
209+
```
210+
http://www.macrozheng.com {        route /admin/* {                uri strip_prefix /admin                file_server {                        root /mydata/caddy/html/admin                }        }        route /app/* {                uri strip_prefix /app                file_server {                        root /mydata/caddy/html/app                }        }        file_server * {                root /mydata/caddy/html/www        }}
211+
```
212+
213+
### HTTPS
214+
215+
> Caddy能自动支持HTTPS,无需手动配置证书,这就是之前我们在配置域名时需要使用`http://`开头的原因,要想使用Caddy默认的HTTPS功能,按如下步骤操作即可。
216+
217+
* 首先我们需要修改域名的DNS解析,直接在购买域名的网站上设置即可,这里以`docs.macrozheng.com`域名为例;
218+
* 之后使用如下命令验证DNS解析记录是否正确,注意配置的服务器的`80``443`端口需要在外网能正常访问;
219+
220+
```
221+
curl "https://cloudflare-dns.com/dns-query?name=docs.macrozheng.com&type=A" \  -H "accept: application/dns-json"
222+
```
223+
224+
* 修改`Caddyfile`配置文件,进行如下配置;
225+
226+
```
227+
docs.macrozheng.com {        root * /mydata/caddy/html/docs        file_server browse}
228+
```
229+
230+
* 然后使用`caddy run`命令启动Caddy服务器即可,是不是非常方便!
231+
232+
```
233+
caddy run
234+
```
235+
236+
### Docker支持
237+
238+
> 当然Caddy也是支持使用Docker进行安装使用的,其使用和直接在CentOS上安装基本一致。
239+
240+
* 首先使用如下命令下载Caddy的Docker镜像;
241+
242+
```
243+
docker pull caddy
244+
```
245+
246+
* 然后在`/mydata/caddy/`目录下创建`Caddyfile`配置文件,文件内容如下;
247+
248+
```
249+
http://192.168.3.105:80respond "Hello, world!"
250+
```
251+
252+
* 之后使用如下命令启动caddy服务,这里将宿主机上的`Caddyfile`配置文件、Caddy的数据目录和网站目录挂载到了容器中;
253+
254+
```
255+
docker run -p 80:80 -p 443:443 --name caddy \    -v /mydata/caddy/Caddyfile:/etc/caddy/Caddyfile \    -v /mydata/caddy/data:/data \    -v /mydata/caddy/html:/usr/share/caddy \    -d caddy
256+
```
257+
258+
* 之后使用`docker exec`进入caddy容器内部执行命令;
259+
260+
```
261+
docker exec -it caddy /bin/sh
262+
```
263+
264+
* 输入Caddy命令即可操作,之后的操作就和我们直接在CentOS上安装一样了。
265+
266+
![](https://mmbiz.qpic.cn/mmbiz_png/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyXGYibV5qAibu6EiauLWxnYDibKibBaInlSTmtrM10wuj3zRHcOkEibUJ7bcg/640?wx_fmt=png)
267+
268+
## 总结
269+
270+
今天体验了一把Caddy,其强大的指令功能,让我们无需多余的配置即可实现各种功能,使用起来确实非常优雅!尤其是其能自动配置实现HTTPS,非常不错!Nginx能实现的功能Caddy基本都能实现,大家可以对比下之前写的[Nginx使用教程](https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247484240&idx=1&sn=d5db6374b07749639689383f61359e03&scene=21#wechat_redirect) ,你就会发现使用Caddy来实现有多么优雅!
271+
272+
## 参考资料
273+
274+
* 项目地址:https://github.com/caddyserver/caddy
275+
* 官方文档:https://caddyserver.com/
276+
277+
* * *
278+
279+
**微信8.0将好友放开到了一万,小伙伴可以加我大号了,先到先得,再满就真没了**
280+
281+
**扫描下方二维码即可加我微信啦,`2022,抱团取暖,一起牛逼。`**
282+
283+
![](https://mmbiz.qpic.cn/mmbiz_jpg/CKvMdchsUwliaXhlIY1ibvFfDzk0oTqaWyWovicuqACWv6zibOMxSe2GIYlK1zWrZeoI8BxaosSt3LAeJDZmPjWLtg/640?wx_fmt=jpeg)
284+
285+
## 推荐阅读
286+
287+
* [你是外包,麻烦不要偷吃零食,注意素质...](https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247498972&idx=1&sn=e0ac4aba19e2f89856bf93c1cbe1de3d&scene=21#wechat_redirect)
288+
* [xxl-job Vs ElasticJob,谁牛?](https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247498955&idx=1&sn=173323cfe634d6c543fe319a1046eaa8&scene=21#wechat_redirect)
289+
* [秒建炫酷的开源项目文档,这款神器用起来够优雅!](https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247498925&idx=1&sn=39c5993faf8ee37b67cadee1345ccf3d&scene=21#wechat_redirect)
290+
* [Objects.equals 有坑!!!](https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247498875&idx=1&sn=ee71f0dd7e40c97562e50adb44ae44c6&scene=21#wechat_redirect)
291+
* [聊聊电商系统中常见的9大坑!库存超卖、重复下单、物流单ABA...](https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247498832&idx=1&sn=38549bb9e45831a263116555e63528a8&scene=21#wechat_redirect)
292+
* [神器 SpringDoc 横空出世!最适合 SpringBoot 的API文档工具来了!](https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247498682&idx=1&sn=431ac22705022bda2e5c127cf9dfe630&scene=21#wechat_redirect)
293+
* [40K+Star!Mall电商实战项目开源回忆录!](https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247486684&idx=1&sn=807fd808adac8019eb2095ba088efe54&scene=21#wechat_redirect)
294+
* [mall-swarm 微服务电商项目发布重大更新,打造Spring Cloud最佳实践!](https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247486362&idx=1&sn=fb6d71d328e8eee34976a86135dc6a7d&scene=21#wechat_redirect)
295+
296+
297+
298+
![](https://mmbiz.qpic.cn/mmbiz_gif/CKvMdchsUwlkU1ysoMgG69dVYbCQcI6Byneb8ibzZWPfUCr3T8CuBicCSGyFE6SpAtxpxtDCp6VlZ4F1hEL1BNyg/640?wx_fmt=gif)
299+
300+
>转载链接:[https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247499016&idx=1&sn=b4f12202e884dd02588cc701d0946ad3&chksm=fc2c4100cb5bc8167dcde2b0fb052e534ef335f2a8e6afd4034a5cfb8292d05423af0f35dcd0#rd](https://mp.weixin.qq.com/s?__biz=MzU1Nzg4NjgyMw==&mid=2247499016&idx=1&sn=b4f12202e884dd02588cc701d0946ad3&chksm=fc2c4100cb5bc8167dcde2b0fb052e534ef335f2a8e6afd4034a5cfb8292d05423af0f35dcd0#rd),出处:macrozheng,整理:沉默王二
32.6 KB
Loading

0 commit comments

Comments
 (0)