mirror of
https://github.com/go-gitea/gitea.git
synced 2026-03-12 02:24:21 -05:00
Gitea Freezing on FreeBSD Using Jails and a Possible Way to Fix It When Using a Reverse Proxy to Serve #8395
Closed
opened 2025-11-02 08:04:45 -06:00 by GiteaMirror
·
5 comments
No Branch/Tag Specified
main
release/v1.25
release/v1.24
release/v1.23
release/v1.22
release/v1.21
release/v1.20
release/v1.19
release/v1.18
release/v1.17
release/v1.16
release/v1.15
release/v1.14
release/v1.13
release/v1.12
release/v1.11
release/v1.10
release/v1.9
release/v1.8
v1.25.3
v1.25.2
v1.25.1
v1.25.0
v1.24.7
v1.25.0-rc0
v1.26.0-dev
v1.24.6
v1.24.5
v1.24.4
v1.24.3
v1.24.2
v1.24.1
v1.24.0
v1.23.8
v1.24.0-rc0
v1.25.0-dev
v1.23.7
v1.23.6
v1.23.5
v1.23.4
v1.23.3
v1.23.2
v1.23.1
v1.23.0
v1.23.0-rc0
v1.24.0-dev
v1.22.6
v1.22.5
v1.22.4
v1.22.3
v1.22.2
v1.22.1
v1.22.0
v1.23.0-dev
v1.22.0-rc1
v1.21.11
v1.22.0-rc0
v1.21.10
v1.21.9
v1.21.8
v1.21.7
v1.21.6
v1.21.5
v1.21.4
v1.21.3
v1.21.2
v1.20.6
v1.21.1
v1.21.0
v1.21.0-rc2
v1.21.0-rc1
v1.20.5
v1.22.0-dev
v1.21.0-rc0
v1.20.4
v1.20.3
v1.20.2
v1.20.1
v1.20.0
v1.19.4
v1.21.0-dev
v1.20.0-rc2
v1.20.0-rc1
v1.20.0-rc0
v1.19.3
v1.19.2
v1.19.1
v1.19.0
v1.19.0-rc1
v1.20.0-dev
v1.19.0-rc0
v1.18.5
v1.18.4
v1.18.3
v1.18.2
v1.18.1
v1.18.0
v1.17.4
v1.18.0-rc1
v1.19.0-dev
v1.18.0-rc0
v1.17.3
v1.17.2
v1.17.1
v1.17.0
v1.17.0-rc2
v1.16.9
v1.17.0-rc1
v1.18.0-dev
v1.16.8
v1.16.7
v1.16.6
v1.16.5
v1.16.4
v1.16.3
v1.16.2
v1.16.1
v1.16.0
v1.15.11
v1.17.0-dev
v1.16.0-rc1
v1.15.10
v1.15.9
v1.15.8
v1.15.7
v1.15.6
v1.15.5
v1.15.4
v1.15.3
v1.15.2
v1.15.1
v1.14.7
v1.15.0
v1.15.0-rc3
v1.14.6
v1.15.0-rc2
v1.14.5
v1.16.0-dev
v1.15.0-rc1
v1.14.4
v1.14.3
v1.14.2
v1.14.1
v1.14.0
v1.13.7
v1.14.0-rc2
v1.13.6
v1.13.5
v1.14.0-rc1
v1.15.0-dev
v1.13.4
v1.13.3
v1.13.2
v1.13.1
v1.13.0
v1.12.6
v1.13.0-rc2
v1.14.0-dev
v1.13.0-rc1
v1.12.5
v1.12.4
v1.12.3
v1.12.2
v1.12.1
v1.11.8
v1.12.0
v1.11.7
v1.12.0-rc2
v1.11.6
v1.12.0-rc1
v1.13.0-dev
v1.11.5
v1.11.4
v1.11.3
v1.10.6
v1.12.0-dev
v1.11.2
v1.10.5
v1.11.1
v1.10.4
v1.11.0
v1.11.0-rc2
v1.10.3
v1.11.0-rc1
v1.10.2
v1.10.1
v1.10.0
v1.9.6
v1.9.5
v1.10.0-rc2
v1.11.0-dev
v1.10.0-rc1
v1.9.4
v1.9.3
v1.9.2
v1.9.1
v1.9.0
v1.9.0-rc2
v1.10.0-dev
v1.9.0-rc1
v1.8.3
v1.8.2
v1.8.1
v1.8.0
v1.8.0-rc3
v1.7.6
v1.8.0-rc2
v1.7.5
v1.8.0-rc1
v1.9.0-dev
v1.7.4
v1.7.3
v1.7.2
v1.7.1
v1.7.0
v1.7.0-rc3
v1.6.4
v1.7.0-rc2
v1.6.3
v1.7.0-rc1
v1.7.0-dev
v1.6.2
v1.6.1
v1.6.0
v1.6.0-rc2
v1.5.3
v1.6.0-rc1
v1.6.0-dev
v1.5.2
v1.5.1
v1.5.0
v1.5.0-rc2
v1.5.0-rc1
v1.5.0-dev
v1.4.3
v1.4.2
v1.4.1
v1.4.0
v1.4.0-rc3
v1.4.0-rc2
v1.3.3
v1.4.0-rc1
v1.3.2
v1.3.1
v1.3.0
v1.3.0-rc2
v1.3.0-rc1
v1.2.3
v1.2.2
v1.2.1
v1.2.0
v1.2.0-rc3
v1.2.0-rc2
v1.1.4
v1.2.0-rc1
v1.1.3
v1.1.2
v1.1.1
v1.1.0
v1.0.2
v1.0.1
v1.0.0
v0.9.99
Labels
Clear labels
$20
$250
$50
$500
backport/done
💎 Bounty
docs-update-needed
good first issue
hacktoberfest
issue/bounty
issue/confirmed
issue/critical
issue/duplicate
issue/needs-feedback
issue/not-a-bug
issue/regression
issue/stale
issue/workaround
lgtm/need 2
modifies/api
modifies/translation
outdated/backport/v1.18
outdated/theme/markdown
outdated/theme/timetracker
performance/bigrepo
performance/cpu
performance/memory
performance/speed
pr/breaking
proposal/accepted
proposal/rejected
pr/wip
pull-request
reviewed/wontfix
💰 Rewarded
skip-changelog
status/blocked
topic/accessibility
topic/api
topic/authentication
topic/build
topic/code-linting
topic/commit-signing
topic/content-rendering
topic/deployment
topic/distribution
topic/federation
topic/gitea-actions
topic/issues
topic/lfs
topic/mobile
topic/moderation
topic/packages
topic/pr
topic/projects
topic/repo
topic/repo-migration
topic/security
topic/theme
topic/ui
topic/ui-interaction
topic/ux
topic/webhooks
topic/wiki
type/bug
type/deprecation
type/docs
type/enhancement
type/feature
type/miscellaneous
type/proposal
type/question
type/refactoring
type/summary
type/testing
type/upstream
Mirrored from GitHub Pull Request
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: github-starred/gitea#8395
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @thearchivalone on GitHub (Jan 23, 2022).
Gitea Version
1.15.10
Git Version
2.34.1
Operating System
FreeBSD 13.0-p6
How are you running Gitea?
I was running Gitea and Postgres in the same Bastille jail and configured Gitea to listen to the local port Postgres was running on. With some guidance in #18180, it was narrowed down that my particular issue dealt with how I was reverse proxying and possibly running out of local ports too quickly (port exhaustion) for Caddy and other software to interact with. My server is going to be hosting substantially more services so I needed to quickly nip this in the bud. The solution is to use Unix Domain Sockets (UDS from here on out) that can interact with each other between jails. I'm not sure what the security risks are, so your mileage will vary here.
Taken from this guide, you'll need to do a few things:
UDS aren't officially supported in Bastille but can be great if you run a large number of applications on your server that need to be sent across the web (such as a blog or your current git software like Gitea).
Database
PostgreSQL
Can you reproduce the bug on the Gitea demo site?
No
Log Gist
No response
Description
No response
Screenshots
No response
@zeripath commented on GitHub (Jan 25, 2022):
I think we need to be clear here that this is only a solution for port exhaustion.
Port exhaustion is always a potential result of http proxying: https://www.nginx.com/blog/overcoming-ephemeral-port-exhaustion-nginx-plus/ . It may be that Gitea is making this worse but I'm not certain how to find a cause.
Similarly there's an issue with port exhaustion from the db connections - we experienced this problem on MySQL earlier and we added some options to help reduce the numbers of ports opened when communicating with MySQL. It may be that we need a similar thing for Postgres.
@tsowa commented on GitHub (Jan 25, 2022):
In #18180 I showed my configuration for gitea, I have never had a problem with jails and gitea.
@thearchivalone commented on GitHub (Jan 25, 2022):
Thanks for getting back to me. I agree that this is for a specific situation and mostly posted it for anyone else that wanted to run Unix Sockets like this. My previous server I ran using them wherever able without even bothering using localhost ports, so I never experienced the issue until recently. Mind you, I also wasn't using any kind of containers at the time but instead went custom and built almost everything from source, but that's an entirely different subject altogether.
@tsowa my current firewall settings are slightly modified from the Bastille docs example with some extra anchors added for specific IP addresses and whatnot. It's not as advanced as yours but gets the job done. Much of what you have in your nginx config is handled through macros in caddy; outside of using external snippets (short pieces of information that can be loaded from a file), I didn't see much different.
@zeripath commented on GitHub (Jan 25, 2022):
@tsowa any time you are using a http proxy and a db on localhost or same IP, depending on how they handles time_waits and connection closing and db connection scaling there is always a risk of port exhaustion and Gitea blocking due to port exhaustion.
Less drastic cases of port exhaustion can occur in any situation where you bridge the world to one IP alone. Using unix ports completely eradicates this as a possible issue.
The problem is that there is a fundamentally a limited number of ports for TCP connections and every connection has to have a unique port-address pair. (In fact if SO_REUSEADDR is not set every TCP connection has to come from a unique port.)
Outside facing services are essentially prevented from running out of ports by allowing ports to be reused so long as they're pointing to different IP aaddresses (this works unless of course you get more than 65535 connections from the same IP). However, as soon as you have a proxy all of that traffic now has to go from that proxy to your Gitea server, e.g. localhost-localhost. If you add in a db communicating over TCP on localhost then that also takes ports.
The problem is then made worse by db connection pool scaling where contention for db connections means that more connections are opened and then potentially held open in a pool before being closed - (although being held open isn't necessarily the problem - it's the closing and reopening. Everytime a client port is closed it may fall in to a TIME_WAIT state meaning you can't use that port again for up to two minutes!)
This means under load even more ports are taken and the reverse proxy can't get to the ports. Worse, you can end up with a situation whereby http requests are blocked waiting for a db port but all ports are in use by http requests or are in TIME_WAIT. (And it is at this point that Gitea can completely block because as we currently don't pass context down to the db cancelling the http request won't cancel the db request.)
MySQL had a particular problem here so we explicitly created options to tell the connections not to open too many connections. It's likely we need to do the same thing for postgres. It's also possible to change the TIME_WAIT length. (Eventually we will also finally pass context down to db requests and we should be able to cancel requests.)
Docker setups are less badly affected because the db and the http proxy are on different internal IPs meaning that neither should block the other and if the http proxy is blocked waiting for a port that doesn't block the db so one will come soon enough.
However if you're simply using localhost and you can use them, unix ports are probably the best as they do not suffer this problem.
@wxiaoguang commented on GitHub (Apr 16, 2022):
It seems not to be a real issue.
Feel free to reopen if necessary.