技术标签: 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,更加的安全。
这篇文章也比较简单,更高级的应用大家可以去阅读官方文档。
有什么问题和简介,欢迎大家相互讨论。
文章浏览阅读6k次,点赞22次,收藏101次。一、MVC模式简介MVC是一种架构型模式,它本身并不引入新的功能,只是用来指导我们改善应用程序的架构,使得应用的模型和视图相分离,从而得到更好的开发和维护效率。 在MVC模式中,应用程序被划分成了模型(Model)、视图(View)和控制器(Controller)三个部分。其中,模型部分包含了应用程序的业务逻辑和业务数据;视图部分封装了应用程序的输出形式,也就是通常所说的页_mvc模式
文章浏览阅读2k次,点赞2次,收藏5次。1. 设置应用程序图标(finder中展示的图标)在Qt助手(QT Assistant)中,输入“setting”,可以看到下面的列表中有Setting the Application Icon,双击它就可以看到右侧窗口中的帮助文档,帮助文档里介绍了如何设置应用程序图标。文档内容很全面,包括如何设置windows、OS X和linux的程序图标。这里我们介绍如何设置macOS下应用程序的图标。如Qt助手中介绍的方法,QWindows::setWindowIcon()只能设置在程序坞中展示的图标,_qt macos 软件图标
文章浏览阅读8.4k次,点赞7次,收藏20次。微信开发文档上,获取code是在前端页面获取,但是现在也不知道为啥非得在后端获取,获取就获取吧,安排一下。获取code的目的,其实就是为了获取openid和token,获取openid和token的目的,其实是为了获取unionid和用户信息。先写个工具类,主要是两个方法,需要的,你们直接复制粘贴就好public class WxGzhUtils {/*** 获取openid access_token* @param appid* @param secret* @param code* _微信授权后端重定向获取code可行么
文章浏览阅读131次。简单介绍了switch case,快来看看吧~
文章浏览阅读2.6k次。模型空间(model space)也称为对象空间(object space)或局部空间(local space)是指以模型原点为原点的坐标系。世界空间(world space)也称全局空间(global space)是以世界原点为原点的坐标系,世界坐标也就是Unity3D里的绝对坐标。观察空间(view space)也称摄像机空间(camera space)是以摄像机为原点的坐标系。(这是各坐标空..._unity空间转换函数
文章浏览阅读5.7k次。模拟浏览器请求的插件,本人使用的是火狐的HttpRequester插件,安装方法是在扩展程序中搜索名称添加,重启浏览器即可 本文是记录Post和Get请求的基本方法1、Post请求带参数 如上图,若选择请求内容为json格式,则必须使用json(键值对)格式的内容,否则请求报错,请求内容格式如下:{"kkk":{"name":"ddd","age":111},"ssss":{"name":_httprequester 火狐
文章浏览阅读912次,点赞13次,收藏11次。显著性水平从0.05降低到0.01,说明拒绝域也减小,在拒绝域大的情况下接受,那么在该拒绝域变小的情况下也定然接受。[3] 茆诗松, 周纪芗. 概率论与数理统计 (第三版). 中国统计出版社, 2007。[4] 陈家鼎等. 数理统计学讲义 (第二版). 高等教育出版社, 2006。[5] 王松桂等. 概率论与数理统计 (第三版). 科学出版社, 2011。[1] 陈希孺. 概率论与数理统计. 中国科学技术大学出版社, 2009。样本方差是总体方差的无偏估计。统计值是一个数值,统计量是一个随机变量。
文章浏览阅读1.3k次。背景把jsp页面中表单的内容存到数据库,和request.getParameterMap配合使用可以将jsp页面表单的数据转化为bean对象。在对象参数比较多的情况下,使用request.getParameter比较麻烦BeanUtils位于org.apache.commons.beanutils.BeanUtils下面,其方法populate的作用解释如下:完整方法:BeanUtils.populate( Object bean, Map properties ),这个方法会遍_beanutils.populate(customer, map);
文章浏览阅读134次。站长常用的200个js代码1.文本框焦点问题onBlur:当失去输入焦点后产生该事件onFocus:当输入获得焦点后,产生该文件Onchange:当文字值改变时,产生该事件Onselect:当文字加亮后,产生该文件<input type="text" value="郭强" onfocus="if(value=='郭强') {value=''}" onb..._站长之家h5端站点统计js代码
文章浏览阅读131次。社区外卖系统小程序主要功能模块包括推荐菜品、今日特惠、外卖咨询、配送信息、用户反馈,采取面对对象的开发模式进行软件的开发和硬体的架设,能很好的满足实际使用的需求,完善了对应的软体架设以及程序编码的工作,采取MySQL作为后台数据的主要存储单元,采用springboot框架、Java技术、Ajax技术进行业务系统的编码及其开发,实现了本系统的全部功能。
文章浏览阅读248次。ebayAPI接口入点(按图搜索,商品详情,关键词搜索,商品评论,订单类接口),希望以上的示例,可以帮到有需要的朋友。以上示例中,通过发送 HTTP /POST/GET 请求获取ebay商品列表和详情的 API 数据,然后将返回的 JSON 数据解析为对应的数据结构,以便进一步处理和使用。要获取ebay商品列表和商品详情页面数据,您可以通过开放平台的接口或者直接访问ebay商城的网页来获取商品详情信息。调用开放平台提供的接口,传入商品 ID 作为参数,获取对应商品的列表和详情页面数据。
文章浏览阅读758次,点赞22次,收藏8次。Redis 集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis 集群不需要 Sentinel 哨兵也能完成节点移除和故障转移的功能。