this post was submitted on 07 Jul 2023
3 points (100.0% liked)
Lemmy Support
4654 readers
21 users here now
Support / questions about Lemmy.
founded 5 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
So, the part that selects what hostname it serves is the
server_name
directive. What thosehttp://lemmy
andhttp://lemmy-ui
point to is the backend services. In this case, it's assuming the Docker setup where the containers are namedlemmy
andlemmy-ui
respectively. They're completely invisible to the user, and in this case relies on Docker directing those names to the appropriate containers automatically. You don't need to change those, unless you're not using Docker. If you're not using Docker, then those need to point to the address to reach lemmy and lemmy-ui. So for example, you might want to set that tohttp://127.0.0.1:1236
.Essentially, traffic comes in at port 80/443 or whatever your
listen
directives say, then NGINX receives the connection and processes the host header in the request to match it against whichserver{}
block serves thatserver_name
, or falls back to whichever server block defineslisten ..... default_server
, or if there isn't any, it usually falls into whichever server block happens to be first loaded in by the server. Pretty much only thelisten
andserver_name
directives are relevant here in terms of handling incoming traffic from the outside, mostly. Things likessl_*
will also configure how to handle incoming HTTPS connection, but that happens slightly after the server block has been identified using thelisten
andserver_name
directives. Most other directives are about how to handle the request once it's in the server block.Then, it processes the request entirely within that server block. In this particular case, there's a bit of logic so that it proxies it to lemmy-ui unless it's an ActivityPub request or anything not a GET/HEAD request, in which case it tries to proxy it to the lemmy backend service. That's what the
if
directives accomplish here. Usually we put those inlocation
blocks, in this case thelocation /
block so it handles all paths except other location blocks that override it. Some directives can be put directly in the server block and will apply to all locations unless overridden. Technically NGINX processes the location blocks first in order of precision (ie./foo/bar/42/comments
is more specific than/foo
, and when there's a tie it's based on configuration order in the config file).There's also a
location
block to map some URLs like/.well-known
and/pictrs
that also gets proxied to the lemmy backend directly. The way those work is say, you want to handle something athttp://example.com/demo
, you can add alocation /demo {}
block and the directives in that block will only apply when the URL is/demo/*
.Does that clarify things for you?
Thank you and yes, yes it does clarify a lot how nginx is working!
I'm trying to use use the conf file coming with lemmy docker install, and after some searching I don't even know if this is deprecated or not (it's in the http{} ), or how I should tell nginx the information about where to find the docker devices:
Also, shouldn't I tell nginx to listen to port 80?
Also, I get this error when I run "sudo nginx -s reload" and I don't even understand what it means:
nginx: [emerg] host not found in upstream "lemmy" in /etc/nginx/nginx.conf:53
Thank you again, I'm a slow learner!
There's two NGINX servers in the Docker setup: one on the inside, and one on the outside/on the host.
If you run NGINX from the host or outside of the docker-compose,
lemmy
andlemmy-ui
won't resolve because that only exists within Docker. It does a bit of magic that essentially amounts to putting these in the containers'/etc/hosts
and maps to the internal IPs that the containers get. Docker has some sort of virtual router built-in, each compose gets its own virtual network and everything.If you use the Docker setup, you can use the configs I linked from the Ansible repo essentially as-is with minor tweaks. The internal NGINX config can be kept completely unchanged, and the outside one only needs minor tweaks to set up your own hostname and the port for the internal one. You only need to fill in the
{{domain}}
and{{lemmy_port}}
placeholders in the outside one. The example outside NGINX config already listens to both 80 and 443.Basically with the suggested setup, you go Internet -> your server (port 80/443) -> the internal NGINX in Docker (port 1236) -> lemmy/lemmy-ui.
Good morning and thank you, I'll use your recommended config asap, and then be back with more questions most probably :-) !