使用 Caddy 替代 Nginx,全站升级 https,配置更加简单_caddy websocket-程序员宅基地

技术标签: Caddy  

使用 Caddy 替代 Nginx,全站升级 https,配置更加简单

 

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

  1. 安全
    Caddy 是一个默认使用https协议的web服务器
  2. 无依赖
    Caddy 使用 Go 语言编写,编译好的二进制文件能够运行在任何支持Go语言的平台,不需要自己安装任何库。
  3. 使用简单
    Caddy 的配置简单,不管你是新的web开发者,还是专业人士,都能够快速上手

 

安装以及运行

  1. 下载 Caddy download
    在官网上选择指定的平台,下载指定平台的运行包。 这里以 CentOS 7.0 x64 为例。 选择 Linux 64-bit,然后点 DOWNLOAD。
    通过ftp将下载好的包上传到服务器,或者复制出下载地址直接在服务端 wget https://caddyserver.com/download/linux/amd64
    使用 wget 的模式下载下来的文件名是 amd64。 tar -xzvf amd64 解压, 解压后文件如下。

    我们可以直接运行 ./caddy,这样就启动了一个静态的web服务器,根目录为当前目录,端口为 2015,可以通过你服务器的ip地址加上:2015 进行访问了。 如果你访问的时候,报404异常,在你当前目录下添加一个 index.html 文件即可。

 

Caddyfile 配置

这里我们看一下官网的例子说明 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,更加的安全。
这篇文章也比较简单,更高级的应用大家可以去阅读官方文档。
有什么问题和简介,欢迎大家相互讨论。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Aria_Miazzy/article/details/97500824

智能推荐

基于STM32的web+app的智慧灌溉系统物联网嵌入式软硬件开发单片机毕业源码案例设计-程序员宅基地

文章浏览阅读217次。5.配有基于SpringBoot、Vue、uniapp、Qt的Web端、移动端、PC端,远程控制,远程查看数据。6.云平台具有设备管理、数据管理等完整的功能。4.远程设置光照强度和土壤湿度的阈值。2.湿度太干时自动打开水泵进行浇水。1.实时监测光照强度、土壤湿度。基于STM32的智慧灌溉系统。3.光照太暗时自动开灯补光。5.通信基于MQTT协议。

bat批量复制文件(一键打包更新代码,避免手动一个个复制)-程序员宅基地

文章浏览阅读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批量复制文件

深度学习——BEDSR-Net_bedsr-net a deep shadow removal network from a sin-程序员宅基地

文章浏览阅读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: A Compression-friendly Readonly File System for Resource-scarce Devices》_erofs 论文-程序员宅基地

这篇文章介绍了一种面向资源稀缺设备的压缩友好的只读文件系统EROFS,能显著减少存储空间使用,减少I/O放大和计算开销,并降低内存分配开销。

python计算机视觉编程——sift特征提取和ransac减少错配_python实现sift特征匹配及ransca误匹配剔除-程序员宅基地

文章浏览阅读5.8k次,点赞8次,收藏100次。SIFT算法运用演示一、什么是sift算法SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。它是由David Lowe发明的。SIFT在2004年由Lowe完善并经受住了时间的考验。SIFT特征是基于物体上的一些局部外观的兴趣点而与影..._python实现sift特征匹配及ransca误匹配剔除

Visual Studio Code有哪些你常用的插件?_类似beautify插件-程序员宅基地

文章浏览阅读7.5k次。Java自学的网站(Java全栈工程师 | 以实例驱动学习 | how2j.cn)仅供参考:beautify,这款类似于vscode里格式化代码的功能,不错;Emoji,很好玩的一款插件,可以在代码中插入emoji了,也许是程序猿的娱乐方式吧;HTML Snippets,这款插件包含html标签,非常全,很实用;Can I Use,自动检测所写代码能否在相应容器正常编译执行;Java..._类似beautify插件

随便推点

大电流dcdc降压芯片20a_基于MC34063芯片DC-DC(20-5)降压型变换电路-程序员宅基地

文章浏览阅读1.4k次。目录基于MC34063芯片的DC-DC(20/5)降压型变换电路.................................................................21引言......................................................................................................_dc电源芯片 20a

About Add DataRow-程序员宅基地

文章浏览阅读128次。当从一个表中将记录Copy到另一个结构相同的表中的时候,有两种方式:DataTable.ImportRow()或: DataTable.Rows.Add()正确的使用方法: dt1.ImportRow(dt.Rows[0]);或: dt1.Rows.Add(dt.Rows[0].ItemArray);不要使用:..._add data row

linux中-f的含义,linux 下shell中if的“-e,-d,-f”的含义-程序员宅基地

文章浏览阅读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

【JS】根据日期和给定的天数,计算日期的前几天或者后几天的日期时间_js计算某个日期多少天后的日期-程序员宅基地

文章浏览阅读301次。【代码】【JS】根据日期和给定的天数,计算日期的前几天或者后几天的日期时间。_js计算某个日期多少天后的日期

WebRTC-Android 源码导读(二):预览实现分析_surfaceviewrenderer-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏5次。在本系列第一篇中,我们分析了 WebRTC-Android 相机采集的实现,本文中我们将分析预览的实现。有过一定相机开发经验的朋友可能会疑惑,预览还有什么好分析的,不是直接 camera.setPreviewDisplay 或者 camera.setPreviewTexture 就能在 SurfaceView/TextureView上预览了吗?实际上预览还有更高级的玩法,尤其是需要加上图像处理功能..._surfaceviewrenderer

Easyx-----c语言实现斗地主_easyx制作打牌-程序员宅基地

文章浏览阅读2.7k次,点赞28次,收藏88次。tools.hpp源.cpp_easyx制作打牌