当前位置: 首页 > 工具软件 > Caddy > 使用案例 >

SSL 证书免费,自动续期的web服务器Caddy,Caddy2 实战

隗昀
2023-12-01

Caddy 简介

Caddy官网

Caddy 是由go语言开发的web 服务器 ,和nginx 功能作用相同。但是区别在于caddy 没有很多的依赖,或者说是插件。并且 caddy 实现了 ssl 证书每三个月自动续期,ssl 证书免费 。这意味着 使用 caddy 作为web 服务器 不再有nginx 的 ssl 证书 到期且付费的困扰。

以上优点是我研究caddy的动力之一。

安装Caddy

centos7

yum install yum-plugin-copr
yum copr enable @caddy/caddy
yum install caddy

查看caddy状态

systemctl status caddy

要启动caddy,需要建立一个root用户以外的账户,我这里新建的账户叫做caddy,以下为caddy的配置过程

建立一个用于存放网页文件的目录,如/var/www/html,命令如下:

mkdir /var/www
mkdir /var/www/html

建caddy用户

adduser -r -d /var/www/html -s /sbin/nologin caddy

建立caddy去加载配置文件的路径

mkdir /etc/caddy

建立一个空的caddy工作配置参数文件

touch /etc/caddy/Caddyfile

设置路径的访问权限

chown -R root:caddy /etc/caddy

创建用于存放ssl证书的路径

mkdir /etc/ssl/caddy

chown -R caddy:root /etc/ssl/caddy

chmod 0770 /etc/ssl/caddy

创建用于存放日志的路径

mkdir /var/log/caddy

chown -R caddy:root /var/log/caddy

最后再改一下/var/www/html 这个用于存放网页的路径权限

chown caddy:caddy /var/www/html

改一下配置文件里面的用户信息

查看caddy.service 文件位置

systemctl status caddy

查看 用户和组信息

cat /usr/lib/systemd/system/caddy.service

用户和组都是caddy就不用改了。

设置caddy进程开机自启

systemctl daemon-reload

systemctl enable caddy.service

现在还不能正常成功启动caddy呢,因为还没有配置网站参数信息。

配置网站信息

cd /etc/caddy/

vi /etc/caddy/Caddyfile

Caddyfile文件内容

www.xxx.com {
	# Set this path to your site's directory.
	root * /var/www/html
	
    #log /var/log/caddy/caddy.log

    # Email
    tls user@163.com    
 
	# Enable the static file server.
	file_server

	# Another common task is to set up a reverse proxy:
	# reverse_proxy localhost:8080
}

上传前端网页文件到 /var/www/html目录下

启动caddy服务

systemctl start caddy

查看服务启动状态

systemctl status caddy -l 

基本命令

查看caddy的帮助文档

caddy

Caddy后台服务运行

caddy start

将Caddyfile转化为JSON配置 或 查看 Caddyfile语法是否正确

caddy adapt

重启

systemctl daemon-reload

systemctl restart caddy.service

查看caddy的状态

systemctl status caddy.service

指定配置文件运行caddy

caddy run --config /etc/caddy/Caddyfile
caddy start --config /etc/caddy/Caddyfile

查看日志

 journalctl --no-pager -u caddy

Caddyfile 配置全量配置信息

(handle_info_log) {
	log {
		output file /var/log/caddy/info.log {
                   
                    roll_size 100MiB

                    roll_keep_for 30d
                
                }
                
                format console {

                  time_format wall

                  time_local
                
                }

		level INFO
             
	}
}

(handle_error_log) {
        log {
                output file /var/log/caddy/error.log {

                    roll_size 30MiB

                    roll_keep_for 30d

                }

                format console {

                  time_format wall

                  time_local

                }

                level ERROR

        }
}

(handle_errors) {
	handle_errors {

	     rewrite * /{err.status_code}.html

	     file_server
	}
}

www.xxx.com {

	encode gzip

	import handle_errors

    import handle_info_log
        
    import handle_error_log

    handle /b/* {

       root * /opt/web

       try_files {path} /b/index.html

         file_server

     }

      handle /a/* {

        root * /opt/web

        file_server

      }

	reverse_proxy /framework/* {
		header_down Access-Control-Allow-Origin *
		header_down Access-Control-Allow-Methods GET,POST,OPTIONS
		header_down Access-Control-Allow-Headers X-Requested-With
		to localhost:8081
	}

	reverse_proxy /example/* {
		to localhost:8081
	}

	@logsurl {
		path_regexp logsurl ^/log/(.*)$
	}
	rewrite @logsurl /framework/{http.regexp.logsurl.1}

	@upmsurl {
		path_regexp upmsurl ^/upms/(.*)$
	}
	rewrite @upmsurl /framework/{http.regexp.upmsurl.1}

	@systemsurl {
		path_regexp systemsurl ^/system/(.*)$
	}
	rewrite @systemsurl /framework/{http.regexp.systemsurl.1}

	@workflowsurl {
		path_regexp workflowsurl ^/workflow/(.*)$
	}
	rewrite @workflowsurl /framework/{http.regexp.workflowsurl.1}
}

www.xxx.com : 80 {
    ...
}

解释说明

客户端发送以下请求
https://www.xxx.com/framework/log/queryallLogs。

caddy 服务器会因为路径中的 https://www.xxx.com 开始 走下面这个代码块:

www.xxx.com {

}

接着 /framework/ 会匹配到 如下代码块 :

	reverse_proxy /framework/* {
		header_down Access-Control-Allow-Origin *
		header_down Access-Control-Allow-Methods GET,POST,OPTIONS
		header_down Access-Control-Allow-Headers X-Requested-With
		to localhost:8081
	}
	@logsurl {
		path_regexp logsurl ^/log/(.*)$
	}
	rewrite @logsurl /framework/{http.regexp.logsurl.1}

此时 reverse_proxy 反向代理 将 https://www.xxx.com/framework/代理成
https://localhost:8081;
那么 完整的路径地址 就是 https://localhost:8081/log/queryallLogs。
接着,caddy 发现 该路径的uri 是 以 /log/ 开头的,这时 路径重写指令rewrite 生效,最终路径变成 https://localhost:8081/framework/log/queryallLogs。
祝各位小伙伴学习愉快,欢迎交流。

 类似资料: