技术标签: Caddy
Caddy 是一个多功能的 HTTP web服务器,并且使用Let's Encrypt提供的免费证书,自动让网站升级到HTTPS
Every Site on HTTPS
Caddy is a general-purpose HTTP/2 web server that serves HTTPS by default.
Fork Caddy On Github
这里我们看一下官网的例子说明 Caddy Documentation
:2015 # Host: (any), Port: 2015
localhost # Host: localhost; Port: 2015
localhost:8080 # Host: localhost; Port: 8080
example.com # Host: example.com; Ports: 80->443
http://example.com # Host: example.com; Port: 80
https://example.com # Host: example.com; Ports: 80->443
http://example.com:1234 # Host: example.com; Port: 1234
https://example.com:80 # Error! HTTPS on port 80
*.example.com # Hosts: *.example.com; Port: 2015
example.com/foo/ # Host: example.com; Ports: 80, 443; Path: /foo/
/foo/ # Host: (any), Port: 2015, Path: /foo/
通过上面这些例子,就可以大概了解到Caddy的域名适配规则。
这个是我的所有站点的配置,可以看出来相比Nginx简单了很多:
log 用于记录访问日志
gzip 用于启用gzip压缩
proxy 用于支持反向代理
websocket 用于支持websocket协议
所有的插件文档,可以 Caddy Documentation 从官方文档上看到,都有详细的配置说明,简单易上手。
使用 caddy -conf Caddyfile 就可以使用配置文件来启动,确保80和443端口没有被服务占用。
Caddyfile 文件:
diamondfsd.com { # 启动 http 和 https,访问 http 会自动转跳到 https
log access_log.log # 日志
gzip # 使用gzip压缩
proxy / http://127.0.0.1:3999 { # 路径转发
header_upstream Host {host}
header_upstream X-Real-IP {remote}
header_upstream X-Forwarded-For {remote}
header_upstream X-Forwarded-Proto {scheme}
}
}
http://api.diamondfsd.com https://api.diamondfsd.com { # 同时启用 http 和 https 不会自动转跳
gzip
proxy / http://127.0.0.1:4999 {
header_upstream Host {host}
header_upstream X-Real-IP {remote}
header_upstream X-Forwarded-For {remote}
header_upstream X-Forwarded-Proto {scheme}
}
}
hook.diamondfsd.com {
proxy / http://127.0.0.1:9000 {
header_upstream Host {host}
header_upstream X-Real-IP {remote}
header_upstream X-Forwarded-For {remote}
header_upstream X-Forwarded-Proto {scheme}
}
}
http://file.diamondfsd.com {
proxy / http://127.0.0.1:22222
}
https://file.diamondfsd.com {
root /data/file-upload # 指定静态文件根目录
}
yd.diamondfsd.com {
gzip
root /data/ydig
proxy /ws http://127.0.0.1:9001 { # 转发所有 /ws 为 websocket
websocket
}
}
8.diamondfsd.com {
gzip
root /data/quaver
}
在对比同等情况下 nginx 的配置:
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
gzip on;
gzip_min_length 1k;
gzip_buffers 16 64k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types application/json application/xml text/plain application/javascript text/css image/jpeg image/gif image/png text/javascript;
gzip_vary on;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
server {
listen 80;
server_name diamondfsd.com www.diamondfsd.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
server_name diamondfsd.com www.diamondfsd.com;
listen 443;
ssl on;
ssl_certificate /etc/letsencrypt/live/diamondfsd.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/diamondfsd.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3999;
proxy_http_version 1.1;
proxy_set_header X_FORWARDED_PROTO https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
}
server {
server_name api.diamondfsd.com;
listen 443;
ssl on;
ssl_certificate /etc/letsencrypt/live/api.diamondfsd.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.diamondfsd.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:4999;
proxy_http_version 1.1;
proxy_set_header X_FORWARDED_PROTO https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
}
server {
server_name api.diamondfsd.com;
listen 80;
location / {
proxy_pass http://127.0.0.1:4999;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
}
server {
server_name hook.diamondfsd.com;
listen 80;
location / {
proxy_pass http://127.0.0.1:9000;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
}
server {
server_name file.diamondfsd.com;
listen 80;
location / {
proxy_pass http://127.0.0.1:22222;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
}
server {
server_name file.diamondfsd.com;
listen 443;
ssl on;
ssl_certificate /etc/letsencrypt/live/file.diamondfsd.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/file.diamondfsd.com/privkey.pem;
root /data/file-upload;
expires max;
access_log /data/file-domain.log;
}
server {
listen 80;
server_name yd.diamondfsd.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
server_name yd.diamondfsd.com;
listen 443;
ssl on;
ssl_certificate /etc/letsencrypt/live/yd.diamondfsd.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yd.diamondfsd.com/privkey.pem;
location /ws/ {
proxy_pass http://127.0.0.1:9001;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
root /data/ydig;
expires max;
access_log /data/ydig-domain.log;
}
server {
listen 80;
server_name about.diamondfsd.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
server_name about.diamondfsd.com;
listen 443;
ssl on;
ssl_certificate /etc/letsencrypt/live/about.diamondfsd.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/about.diamondfsd.com/privkey.pem;
root /data/about-me;
expires max;
access_log /data/about-me-domain.log;
}
server {
server_name 8.diamondfsd.com;
listen 80;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
server_name 8.diamondfsd.com;
listen 443;
ssl on;
ssl_certificate /etc/letsencrypt/live/8.diamondfsd.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/8.diamondfsd.com/privkey.pem;
root /data/quaver;
expires max;
access_log /data/quaver-domain.log;
}
}
可以看出,相较于Nginx来说,Caddy 的配置简单了很多,而且默认启用了 https,更加的安全。
这篇文章也比较简单,更高级的应用大家可以去阅读官方文档。
有什么问题和简介,欢迎大家相互讨论。
文章浏览阅读217次。5.配有基于SpringBoot、Vue、uniapp、Qt的Web端、移动端、PC端,远程控制,远程查看数据。6.云平台具有设备管理、数据管理等完整的功能。4.远程设置光照强度和土壤湿度的阈值。2.湿度太干时自动打开水泵进行浇水。1.实时监测光照强度、土壤湿度。基于STM32的智慧灌溉系统。3.光照太暗时自动开灯补光。5.通信基于MQTT协议。
文章浏览阅读357次,点赞3次,收藏9次。如果文件夹不存在,也可以复制过去。复制文件夹用copy,复制目录和里面的文件用xcopy命令: xcopy/y /e /s /i /k源文件夹路径 目标文件夹路径@echo offChcp 65001echo -----copy start-----echo -----copy cssxcopy /y /e /s /i /k D:\crd\cms\workspace\cms..._bat批量复制文件
文章浏览阅读1.3k次,点赞3次,收藏9次。CVPR2020原论文:BEDSR-Net: A Deep Shadow Removal Network from a Single Document Image为了便捷记录文件内容,我们通常直接用手机或相机拍摄文件。由于环境光照的影响,拍摄的图像会产生各种阴影。就文件图像阴影的问题,文章提出了深度学习的方法去阴影。如下图:1.主要工作:首先提出了单幅文件图像去阴影的深度学习网络(Background Estimation Document Shadow Removal Network ,BEDSR_bedsr-net a deep shadow removal network from a single document image
这篇文章介绍了一种面向资源稀缺设备的压缩友好的只读文件系统EROFS,能显著减少存储空间使用,减少I/O放大和计算开销,并降低内存分配开销。
文章浏览阅读5.8k次,点赞8次,收藏100次。SIFT算法运用演示一、什么是sift算法SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。它是由David Lowe发明的。SIFT在2004年由Lowe完善并经受住了时间的考验。SIFT特征是基于物体上的一些局部外观的兴趣点而与影..._python实现sift特征匹配及ransca误匹配剔除
文章浏览阅读7.5k次。Java自学的网站(Java全栈工程师 | 以实例驱动学习 | how2j.cn)仅供参考:beautify,这款类似于vscode里格式化代码的功能,不错;Emoji,很好玩的一款插件,可以在代码中插入emoji了,也许是程序猿的娱乐方式吧;HTML Snippets,这款插件包含html标签,非常全,很实用;Can I Use,自动检测所写代码能否在相应容器正常编译执行;Java..._类似beautify插件
文章浏览阅读1.4k次。目录基于MC34063芯片的DC-DC(20/5)降压型变换电路.................................................................21引言......................................................................................................_dc电源芯片 20a
文章浏览阅读128次。当从一个表中将记录Copy到另一个结构相同的表中的时候,有两种方式:DataTable.ImportRow()或: DataTable.Rows.Add()正确的使用方法: dt1.ImportRow(dt.Rows[0]);或: dt1.Rows.Add(dt.Rows[0].ItemArray);不要使用:..._add data row
文章浏览阅读1.5w次,点赞4次,收藏55次。文件表达式-e filename 如果 filename存在,则为真-d filename 如果 filename为目录,则为真-f filename 如果 filename为常规文件,则为真-L filename 如果 filename为符号链接,则为真-r filename 如果 filename可读,则为真-w filename 如果 filename可写,则为真-x filename 如果..._-f
文章浏览阅读301次。【代码】【JS】根据日期和给定的天数,计算日期的前几天或者后几天的日期时间。_js计算某个日期多少天后的日期
文章浏览阅读2.4k次,点赞2次,收藏5次。在本系列第一篇中,我们分析了 WebRTC-Android 相机采集的实现,本文中我们将分析预览的实现。有过一定相机开发经验的朋友可能会疑惑,预览还有什么好分析的,不是直接 camera.setPreviewDisplay 或者 camera.setPreviewTexture 就能在 SurfaceView/TextureView上预览了吗?实际上预览还有更高级的玩法,尤其是需要加上图像处理功能..._surfaceviewrenderer
文章浏览阅读2.7k次,点赞28次,收藏88次。tools.hpp源.cpp_easyx制作打牌