技术标签: 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,更加的安全。
这篇文章也比较简单,更高级的应用大家可以去阅读官方文档。
有什么问题和简介,欢迎大家相互讨论。
文章浏览阅读4.6k次,点赞4次,收藏8次。作者:Synonyms 项目的作者胡小夕是北京邮电大学研究生,目前实习于今日头条 AI LAB。从事自然语言处理方向研究,在智能客服,知识图谱等领域都有相关研究开发经验。工具包技术说明:该中文近义词工具包采用的基本技术是 Word2vec。Synonyms 的安装十分便捷,我们可以直接使用命令 pip install -U synonyms 完成。该工具包兼容 Python 2 和 Python ..._synonyms.nearby
文章浏览阅读116次。注册用户管理模块该模块是为所有用户登录设计的,注册用户登录后只能进行自己的普通功能操作(如个人信息修改),管理员登录后有不同的权限,管理员能对整个系统的数据进行管理,主要是用户的登录权限以及用户登录后在系统里的操作权限。寄件信息模块注册用户提交寄件信息后,注册用户和管理员都能在后台查看寄件信息,管理员可以对寄件信息进行审核。快递记录模块管理员来录入快递记录,点击快递录入按钮,依次填写要录入的快递数据,点击提交按钮,将数据提交至数据库,然后刷新快递记录页面,每条数据右边有删除和编辑按钮,来完成相应的_基于ssm校园快递领取系统源码
文章浏览阅读112次。我们解决了在给定其他类的带标签示例的图像集合中发现新类的问题。这种设置类似于半监督学习,但明显更难,因为新类没有标记的示例。因此,挑战在于利用标记图像中包含的信息来学习通用的聚类模型,并使用后者来识别未标记数据中的新类。在这项工作中,我们通过结合三个想法来解决这个问题:(1)我们认为,使用标记数据的引导图像表示的常见方法只会引入一种不必要的偏差,而这可以通过使用自我监督学习从有标记和无标记数据的联合上从头开始训练表示来避免;(2)利用秩统计量将模型对带标签类的认识转移到对无标签图像的聚类问题上;_automatically discovering and learning new visual categories with ranking st
文章浏览阅读1.3k次。总流程如下:_peerconnection_client 简化
文章浏览阅读1.6k次,点赞2次,收藏13次。密码学基础安全三要素:完整性、私密性、不可否认性(合法性)一、完整性:数据没有遭到损坏,或者篡改通过完整性算法进行完整性校验:哈希算法----不可逆算法MD5 SHA例如本地:MD5(原始数据+秘钥)=KEY1原始数据+KEY1 发送到邻居处邻居:MD5(原始信息+本地秘钥)=KEY2若KEY1=KEY2,则表示认证成功。二、私密性:数据通过转换,形成另一种格式(就是转换为让其他..._思科ipsec的对称加密和非对称加密说明
文章浏览阅读6k次。目录html基本标签列表标签无序列表有序列表超链接标签a标签假链接表格标签基本表格单元格合并注意事项表单标签【重点】基本介绍form的常见子标签input:输入类型select :选择菜单textarea:文本域通用属性设置默认值其它属性媒体标签html基本标签标题标签<hn></hn> n取值1~6段落标签 段落之间自动进行换行<p></p>粗体标签<b></b>斜体标签<i></i&_html空心圆
文章浏览阅读1.2w次,点赞20次,收藏120次。1. 数据库的基本概念1.1 什么是数据库数据库(database)是用来组织、存储和管理数据的仓库。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。为了方便管理互联网世界中的数据,就有了数据库管理系统的概念(简称:数据库)。用户可以对数据库中的数据进行新增、查询、更新、删除等操作。1.2 常见的数据库及分类市面上的数据库有很多种,最常见的数据库有如下几个:MySQL _数据库 基本概念
文章浏览阅读2.6k次,点赞6次,收藏4次。makefile中支持条件判断语句。可以根据条件的值决定 make 的执行。可以比较两个不同变量或者变量和常量值。条件判断语句只能用于控制 make 实际执行的语句;但是,不能控制规则中命令的执行过程。注意:中间不可以有空格。下一篇介绍函数的定义于调用。_makefile if
文章浏览阅读299次。JS里的ArrayBuffer还记得某个晚上在做 canvas 像素级操作,发现存储像素的数据格式并不是Array类型,而是ArrayBuffer,心想这是什么鬼?后来查了一些资料,发现自己这半年来的JS是白学了,竟然才知道还有这么个东东。首先,这个 ArrayBuffer 类型化数组,类型化数组是JavaScript操作二进制数据的一个接口。最初为了满足JavaScript与显卡之间大量的、实时..._arraybuffer 写入
文章浏览阅读3.1k次,点赞6次,收藏7次。api是什么API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。——百度百科说得通俗易懂一些,就是别人写好的代码,或者编译好的程序,拿去使用,就叫做API。你使用了别人代码(或者程序)中的某个函数、类、对象,就叫做使用了..._前端api是什么意思
文章浏览阅读551次。three.js-顶点点let geometry = new THREE.BufferGeometry();let vertices = new Float32Array([ 0, 0, 0, //顶点1坐标 50, 0, 0, //顶点2坐标 0, 100, 0, //顶点3坐标 0, 0, 10, //顶点4坐标 0, 0, 100, //顶点5坐标 50, 0, 10, //顶点6坐标]);let attribue = new THREE.B_three.js float32array
文章浏览阅读275次。在这篇论文中,我们提出了一种使用无处不在的Wi-Fi检测室内活动的方法,称为PCA-Kalman,并从商用现成的(COTS) Wi-Fi设备中提取CSI信号。进一步地,实验结果显示,在三个不同的测试区域,这种方法的检测率为95%。从图13可以看出,随着窗口大小的增加,三个系统的检测率都在增加,但当窗口大小超过某个设定的阈值时,人员的不同行为状态会导致CSI的时间差异。我们还注意到,除了在所有区域的区域3测试外,PCA取得了出色的结果,因为区域3距离发射机和接收机很远,导致信号中的人员变化不太明显。