Caddy (web server)

Last updated
Caddy
Original author(s) Matthew Holt
Initial release28 April 2015;8 years ago (2015-04-28)
Stable release
2.7.6 [1]   OOjs UI icon edit-ltr-progressive.svg / 8 December 2023;57 days ago (8 December 2023)
Repository github.com/caddyserver/caddy
Written in Go [2]
Operating system BSD variants, Linux, Plan 9, macOS and Windows
Platform IA-32 (i386), x86-64, ARM, MIPS, S390X
Type Web server, reverse proxy server
License Apache 2
Website caddyserver.com OOjs UI icon edit-ltr-progressive.svg

Caddy is an extensible, cross-platform, open-source web server written in Go.

Contents

The name "Caddy" refers both to a helper for tedious tasks, and a way to organize multiple parts into a simplified system. [3] At its core, Caddy is an extensible platform for deploying long-running services ("apps") using a single, unified configuration that can be updated on-line with a REST API. [4] Official Caddy distributions ship with a set of standard modules which include HTTP server, TLS automation, and PKI apps. [5] It is best known for its automatic HTTPS features. [6] [7]

Architecture

Caddy is organized into three main components: a command, the core library, and configuration modules. [8] The command is the extensible interface by which the program is executed; it can also load configuration files, run common modes, manage installed plugins, and offer relevant utility functions. The core library has APIs for loading, unloading, and managing configuration; but it does nothing particularly useful on its own. Most of Caddy's functionality is provided by modules, which are plugins that extend Caddy's configuration structure; for example, the HTTP server is a module. [9] Caddy modules implement various long-running services, web standards, and other useful features.

Caddy's input is a JSON configuration document [10] which is received through an open socket via a RESTful HTTP API. [11] [6] In the absence of an HTTP client, Caddy's command-line interface can be used to load configuration files. [12] Config adapters may be used to convert other configuration formats to JSON. Existing adapters include the Caddyfile, which has first-class support in the command line; and YAML, TOML, Nginx, and several other formats. [13] [6]

When a configuration is received through its administration socket, Caddy decodes the configuration for all the specified modules, and starts running all the app modules. [6] When the app modules are being provisioned, they themselves may load and provision modules that they use. For example, the HTTP server is an app module which uses HTTP handler modules to handle HTTP requests; these handlers might use yet other modules to implement their functionality, and so on. [14] All these modules are provisioned during the config load phase. [8]

Plugins are installed by statically compiling them directly into the Caddy binary. [3] [6] Without plugins, Caddy's native configuration structure only has some basic options for administration and logging. [10] All other functionality must be provided by app modules. Official Caddy distributions ship with dozens of standard modules; [5] others can be added from the project's website, [15] using the xcaddy command line tool, or by manually compiling a custom build. [16]

Miek Gieben forked Caddy to use as the core of CoreDNS, now a project of the Cloud Native Computing Foundation, as he appreciated its overall architecture and simplicity of its configuration. [17]

HTTP server

The HTTP server is an app module that comes standard with official Caddy distributions. [9] It is primarily used as a static file server [18] and load-balancing reverse proxy. [19] While the basis of Caddy's HTTP features use the implementation found in Go's standard library, [20] a variety enhancements and customizations are available as middleware and exposed through configuration parameters: [6]

By default, TLS is used automatically if any routes have a non-empty host matcher. [21] These are assumed to be site names or IP addresses that Caddy is serving, so Caddy will automatically procure and renew certificates for the configured hostnames and IP addresses. When automatic HTTPS is activated in this manner, Caddy will also redirect HTTP requests to their equivalent HTTPS location.

Development

Caddy version 2 was released on May 5, 2020. [7] Reviewers say that it still has a simpler configuration file syntax than the Apache Web Server, although version 2's configuration format is largely incompatible with the previous major release of Caddy. [7] [22]

Related Research Articles

YAML(see § History and name) is a human-readable data serialization language. It is commonly used for configuration files and in applications where data is being stored or transmitted. YAML targets many of the same communications applications as Extensible Markup Language (XML) but has a minimal syntax that intentionally differs from Standard Generalized Markup Language (SGML). It uses both Python-style indentation to indicate nesting, and a more compact format that uses [...] for lists and {...} for maps but forbids tab characters to use as indentation thus only some JSON files are valid YAML 1.2.

<span class="mw-page-title-main">Configuration file</span> Software file used to configure the initial settings for a computer program

In computing, configuration files are files used to configure the parameters and initial settings for some computer programs. They are used for user applications, server processes and operating system settings.

<span class="mw-page-title-main">Webmin</span> Web-based control panel for Unix-like systems

Webmin is a web-based server management control panel for Unix-like systems. Webmin allows the user to configure operating system internals, such as users, disk quotas, services and configuration files, as well as modify and control open-source apps, such as BIND, Apache HTTP Server, PHP, and MySQL.

The Web Server Gateway Interface is a simple calling convention for web servers to forward requests to web applications or frameworks written in the Python programming language. The current version of WSGI, version 1.0.1, is specified in Python Enhancement Proposal (PEP) 3333.

<span class="mw-page-title-main">JSON</span> Open standard file format and data interchange

JSON is an open standard file format and data interchange format that uses human-readable text to store and transmit data objects consisting of attribute–value pairs and arrays. It is a common data format with diverse uses in electronic data interchange, including that of web applications with servers.

Nginx is a web server that can also be used as a reverse proxy, load balancer, mail proxy and HTTP cache. The software was created by Russian developer Igor Sysoev and publicly released in 2004. Nginx is free and open-source software, released under the terms of the 2-clause BSD license. A large fraction of web servers use Nginx, often as a load balancer.

Web2py is an open-source web application framework written in the Python programming language. Web2py allows web developers to program dynamic web content using Python. Web2py is designed to help reduce tedious web development tasks, such as developing web forms from scratch, although a web developer may build a form from scratch if required.

<span class="mw-page-title-main">Spring Roo</span> Open-source software tool

Spring Roo is an open-source software tool that uses convention-over-configuration principles to provide rapid application development of Java-based enterprise software. The resulting applications use common Java technologies such as Spring Framework, Java Persistence API, Thymeleaf, Apache Maven and AspectJ. Spring Roo is a member of the Spring portfolio of projects.

CommonJS is a project to standardize the module ecosystem for JavaScript outside of web browsers.

<span class="mw-page-title-main">API</span> Software interface between computer programs

An application programming interface (API) is a way for two or more computer programs or components to communicate with each other. It is a type of software interface, offering a service to other pieces of software. A document or standard that describes how to build or use such a connection or interface is called an API specification. A computer system that meets this standard is said to implement or expose an API. The term API may refer either to the specification or to the implementation. Whereas a system's user interface dictates how its end-users interact with the system in question, its API dictates how to write code that takes advantage of that system's capabilities.

Mojito is an environment agnostic, Model-View-Controller (MVC) web application framework. It was designed by Ric Allinson.

Leaflet is an open source JavaScript library used to build web mapping applications. First released in 2011, it supports most mobile and desktop platforms, supporting HTML5 and CSS3. Among its users are FourSquare, Pinterest and Flickr.

Kubernetes is an open-source container orchestration system for automating software deployment, scaling, and management. Originally designed by Google, the project is now maintained by the Cloud Native Computing Foundation.

<span class="mw-page-title-main">Webpack</span> Open-source JavaScript module bundler

Webpack is a free and open-source module bundler for JavaScript. It is made primarily for JavaScript, but it can transform front-end assets such as HTML, CSS, and images if the corresponding loaders are included. Webpack takes modules with dependencies and generates static assets representing those modules.

<span class="mw-page-title-main">Progressive web app</span> Specific form of single page web application

A progressive web application (PWA), or progressive web app, is a type of application software delivered through the web, built using common web technologies including HTML, CSS, JavaScript, and WebAssembly. It is intended to work on any platform with a standards-compliant browser, including desktop and mobile devices.

Grunt is a JavaScript task runner, a tool used to automatically perform frequent tasks such as minification, compilation, unit testing, and linting. It uses a command-line interface to run custom tasks defined in a file. Grunt was created by Ben Alman and is written in Node.js. It is distributed via npm. As of October 2022, there were more than 6,000 plugins available in the Grunt ecosystem.

The Redfish standard is a suite of specifications that deliver an industry standard protocol providing a RESTful interface for the management of servers, storage, networking, and converged infrastructure.

<span class="mw-page-title-main">Deno (software)</span> Secure JavaScript and TypeScript runtime

Deno is a runtime for JavaScript, TypeScript, and WebAssembly that is based on the V8 JavaScript engine and the Rust programming language. Deno was co-created by Ryan Dahl, who also created Node.js.

References

  1. "Release v2.7.6". 13 December 2023. Retrieved 8 December 2023.
  2. Gerrand, Andrew (17 February 2016). "Go 1.6 is released". golang.org. Retrieved 5 March 2016.
  3. 1 2 README.md, caddyserver/caddy on GitHub, 2021-09-27, retrieved 2021-09-27
  4. "Welcome - Caddy Documentation". caddyserver.com. Archived from the original on 2015-05-02. Retrieved 2021-09-27.
  5. 1 2 imports.go, caddyserver/caddy on GitHub, 2021-09-27, retrieved 2021-09-27
  6. 1 2 3 4 5 6 Woodbeck, Adam (2021). Network programming with GO : code secure and reliable network services from Scratch. San Francisco, CA. pp. 217–239. ISBN   978-1-7185-0088-4. OCLC   1198449668.{{cite book}}: CS1 maint: location missing publisher (link)
  7. 1 2 3 Jim Salter (May 6, 2020). "Caddy offers TLS, HTTPS, and more in one dependency-free Go Web server". Ars Technica. Retrieved June 12, 2023.
  8. 1 2 "Architecture - Caddy Documentation". caddyserver.com. Archived from the original on 2020-04-14. Retrieved 2021-09-27.
  9. 1 2 "Module http - Caddy Documentation". caddyserver.com. Archived from the original on 2020-05-06. Retrieved 2021-09-27.
  10. 1 2 "JSON Config Structure - Caddy Documentation". caddyserver.com. Archived from the original on 2020-04-14. Retrieved 2021-09-27.
  11. "API - Caddy Documentation". caddyserver.com. Archived from the original on 2020-03-02. Retrieved 2021-09-27.
  12. "Command Line - Caddy Documentation". caddyserver.com. Archived from the original on 2020-03-02. Retrieved 2021-09-27.
  13. "Config Adapters - Caddy Documentation". caddyserver.com. Archived from the original on 2020-04-14. Retrieved 2021-09-27.
  14. Holt, Matthew (2019-12-04), The Engineering Challenges of long running go programs, Forge Utah, retrieved 2021-09-27
  15. "Download Caddy". caddyserver.com. Archived from the original on 2015-05-02. Retrieved 2021-09-27.
  16. "Build from source - Caddy Documentation". caddyserver.com. Archived from the original on 2020-05-29. Retrieved 2021-09-27.
  17. John Balemaric; Cricket Liu (2019). Learning CoreDNS. "O'Reilly Media, Inc.". ISBN   9781492047919 . Retrieved 12 June 2023.
  18. "Static files quick-start - Caddy Documentation". caddyserver.com. Archived from the original on 2020-05-08. Retrieved 2021-09-27.
  19. "Reverse proxy quick-start - Caddy Documentation". caddyserver.com. Archived from the original on 2020-05-08. Retrieved 2021-09-27.
  20. Holt, Matthew (2015-05-27). "A Look Inside Caddy, a Web Server Written in Go". blog.gopheracademy.com. Archived from the original on 2015-05-30. Retrieved 2021-09-27.
  21. "Automatic HTTPS - Caddy Documentation". caddyserver.com. Archived from the original on 2016-03-04. Retrieved 2021-09-27.
  22. Jack Wallen (May 26, 2022). "How to deploy a single web page to the Caddy server from a Caddyfile". TechRepublic. Retrieved 12 June 2023.