Nginx Modern Reference Architectures
github.com
github.com
As an IaC tool, can anyone speak of how it fits in the landscape compared to Chef, Puppet, Ansible, SaltStack and, oh, Terraform?
Not to nitpick but there is so much more that is wrong with Terraform than HCL e.g. lack of dynamic providers.
Just being able to DRY your code and write tests is already worth the cost of admission for me.
I do use CDKTF where Terraform lacks: dynamic providers and dynamic resource names. For anything else, modular Terraform code does that and does it better, and it's more readable and works with the existing Terraform ecosystem of Terraform Cloud, linters, security scanners, drift detectors, etc.
nginx: [emerg] host not found in upstream "my-app"
In my eyes, that's a massive pain when you're running something like Docker Swarm with container health checks that don't route traffic to dynamically added internal names before the actual health checks for the containers have passed successfully. This probably isn't specific just for Docker Compose but also other solutions that handle networking similarly.I wrote more about it on my blog: https://blog.kronis.dev/everything%20is%20broken/nginx-confi...
The sad thing is that using variables for that proxy_pass URL doesn't work either, when you want to use "proxy_redirect default", without which some applications that you're hosting tend to fail due to weird redirects:
nginx: [emerg] "proxy_redirect default" cannot be used with "proxy_pass" directive with variables
Alas, I'm in the weird spot where I cannot use Nginx for certain deployments, say, proxying 10-20 apps on my server but wanting most of them to keep working when one fails, without resorting to something like Kubernetes for managing the ingress due to some pretty tight resource limitations (even with stuff like K3s).In comparison, Caddy is a little bit more usable, but also not quite as battle tested. Actually, Apache2/httpd might also be a viable alternative due to mod_md adding support for Let's Encrypt built in (like Caddy, unlike Nginx which needs certbot), if not for the performance.
Then again, the code that I write is the bottleneck more often than the actual web server, except for cases where one might use mod_php instead of fpm (though if you need to work with PHP and Apache and can afford the little extra work of configuring fpm, it's not too hard to fix either).
Personally, if nginx made letsencrypt as easy as caddy does, I'd never even think about caddy. That's its One Thing that kinda tempts me.
31% nginx 23% apache 8% Openresty (which I've never heard of, looks like it is an augmented nginx) 5% cloudflare
[1]: https://github.com/kubernetes/ingress-nginx I took pains to say "community-maintained" because there's also an official nginx ingress controller from F5 (current corporate owner of nginx).
There's not a single proof except heartbleed in OpenSSL. I merely asked the author to provide the proof, not for you and I to engage in Go's memory safety and billions in damages and inherent nature of C and so on.
If we were to sum all the "damages" caused by faulty software, we'd arrive at a number that exceeds the total sum of money on planet Earth, let's not use that false metric for this discussion.
Is there an actual problem right now with nginx that Caddy circumvents with its architecture? Yes or no? That's the question.
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0133
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2013-2028
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-2089
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-4315
Should I go on? None of the above errors is possible in a memory safe language like golang.
Discord have switched away from Go for some performance-critical services because of it. [0] https://discord.com/blog/why-discord-is-switching-from-go-to...
Go is fast enough for Google. It's too slow for you?
I don't know. I haven't used Apache HTTP in a while, but Nginx seems to have a lot more foot-guns. I'm planning on giving Caddy a go on my next server upgrade.
The EFF cerbot plugin has it covered; assuming your generic Debian server with nginx already configured to host www.domain.com (trivial hello, world setup - nothing fancy) then it's:
apt-get install cerbot python3-certbot-nginx
certbot --nginx -d www.domain.com -d domain.com \
--agree-tos -m "email@domain.com" --no-eff-email \
--deploy-hook "systemctl reload nginx"
systemctl restart nginx
All done. Certbot is already running as a systemd service to handle ongoing renewals and it'll now restart nginx if your cert is updated. This example uses the trivial http-01 ACME method, if you need the more complex DNS based setup for wildcards that'll take a bit more elbow grease.That aside, for me the trade-off was different and I was willing to give up the benefits of included acme support for the benefits of running a very well-supported and well-known web server that at this point hosts most of the internet and which can run on port 80/443 without iptables hacks (not sure whether this still applies to caddy)
> which can run on port 80/443 without iptables hacks
Not sure what you mean. Do you mean that you need root to bind to those ports? In which case, you can give the process CAP_NET_BIND_SERVICE which lets it. Caddy's systemd service does this, and runs as a non-root user: https://github.com/caddyserver/dist/blob/2ceb535e076ed9b3083...
I do wish that NGINX made LetsEncrypt as easy as to use as Caddy does. We are all big fans of LetsEncrypt and are quite happy to see NGINX donating to the project.
In this project (MARA), LetsEncrypt support is integrated via [Cert Manager](https://cert-manager.io/) for Kubernetes. This is nice because it supports certs from a variety of issuers like AWS, Google, Vault, Cloudflare, etc in addition to Let's Encrypt.
As a side note, I'm looking at Traefik in my homelab and it's honestly difficult because I'm so comfortable with Nginx.
I also know a huge hospital chain in the US is using Caddy.
None of the proxies seem to do well with bidirectional gRPC streams as they just treat gRPC as a h2 proxy but I'd love to see that proven wrong.
I used this Caddyfile to proxy to the route_guide example (https://github.com/grpc/grpc-go/tree/master/examples/route_g...):
```
localhost {
reverse_proxy h2c://localhost:50051
}```
It works like a charm.
[0] https://github.com/caddyserver/caddy/blob/e4ce40f8ff04240540...
Even worse than that, any time I tried to google to better understand how to do something with caddy, every result returned how to achieve exactly that with nginx; and would rarely find the way to do it with caddy.
But it's been about a year since that, unsure if things have changed.
Could you be more specific? We keep hearing vague comments like this about our docs, but without feedback pointing to specific issues, we can't improve them.
I suggest that next time you have trouble finding the information you're looking for, reach out to us and let us know. Open a topic on the forums, we'll be glad to help you find what you're looking for. And if you do so and point out a lack in our docs, we'll know where to focus our efforts.
Having said that, I’ll keep this in mind next time I try out again; and if I run into something, I’ll reach out in the forums.
I was at the time trying to setup jupyter to work with a reverse proxy such that I could access jupyter through zerotier.
Sorry this is all probably a messy set of words that don’t all make sense together with more details. I’ll commit to next time that I’m trying this or anything else, and I hit a wall, I’ll ask.
I was not offensive or ill-mannered, I merely wondered why a person, that's apparently capable of doing minimal research, does not do so before asking for opinion of people on HN in regards to software details. Briefly judging GitHub activity is not the way to make conclusions, which was the only detail being covered.
It's easy to label someone or something rude, I can't control how you read the text I write and what the imaginary tone of voice is. Great Robin Hood display, I love the fact we all get to be judge and jury who decide what's good and what's bad, often missing the real intent.
https://web.archive.org/web/20170913160203/https://caddyserv...
But I think Caddy is a fine server as well.
> WORK IN PROGRESS: Please note that this module is still unfinished and may have bugs. Please try it out and file bug reports - thanks!
Of course, I could run something else in front of the server, but it's simpler for my use cases not to. The auto-SSL and simplified configuration were very attractive things about Caddy, however.
If your CMS provides it, maybe you could run an exit poll for people who demo Caddy, then look elsewhere, as I'm just speaking from my own experience.
However I wonder if it would work better if the module were brought under the Caddy namespace and marked "beta".
At least then, there would be a show of commitment for the idea, if not the implementation.
Recently I've been looking at the Symfony framework, and this is how they introduce features, with a clear warning that the API etc. is subject to change.
Also you definitely need rate limiting out of the box, not as some beta plugin that needs to be fiddled in manually.
Also streaming is something that needs really good testing with high loads.
K8s is important for many people, too.
Of course it is not easy to find someone willing to test on a high traffic site when there are well established alternatives since many years and no actual problem needs to be solved.
"Easy configuration" is not very important for admins of high traffic sites. Not easy to find what could be the selling point for Caddy, but it should deliver one or two special things more.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package caddyBiggest reason is that debian's packaging requirements are way too much of a burden for us to conform to, especially for Go apps. And they update way too slow for us to be comfortable with.
https://web.archive.org/web/20170913160203/https://caddyserv...
The project lost tons of good faith back then, and in my eyes (as a brand) never recovered.