alt-python packages. Each app picks its own version, and the virtualenv lives separate from the system Python.
Available versions
Available versions vary by host. Typical rotation:- Python 3.11. Active.
- Python 3.10. Maintained.
- Python 3.9. Older, still common for legacy apps.
Set up an app
Click Create Application
On an empty account, you land on a list page with a + Create Application button.
Fill in the form
- Python version: pick from the dropdown.
- Application root: directory under your home, e.g.
myapp. Created if it doesn’t exist. - Application URL: domain dropdown plus optional path. Use
/for the root or/apifor a sub-path. - Application startup file: defaults to
passenger_wsgi.py. Leave it as that unless you have a reason. - Application Entry point: dotted path plus callable, format
module:callable. For Django:<project>.wsgi:application. For Flask:<module>:app. - Passenger log file: optional. Useful for catching boot errors.
Manage an app
| Button | What it does |
|---|---|
| Run Pip Install | Reads requirements.txt and installs into the per-app virtualenv. |
| Stop App | Halts Passenger for this app. The URL returns 503. |
| Restart | Equivalent to touch tmp/restart.txt. Reloads the running app. |
| Edit | Reopens the form. Saving overwrites the .htaccess. |
| Destroy | Removes Passenger registration and the per-app virtualenv. |
requirements.txt (relative to the application root). The Environment variables editor sits below the buttons.
The Passenger contract
Passenger expects a WSGI callable namedapplication. Your passenger_wsgi.py either defines it directly or imports it from your app.
For Flask:
passenger_wsgi.py
passenger_wsgi.py
app.run(), no manage.py runserver.
ASGI apps
Native ASGI (FastAPI, Starlette, Channels) needs a WSGI shim. The common bridge isasgiref.WsgiToAsgi reversed, but Passenger’s WSGI mode does not handle WebSockets or HTTP/2 streaming over ASGI. For a sync FastAPI subset, wrap with a2wsgi:
passenger_wsgi.py
Reference: where things live
| What | Path |
|---|---|
| Activated env script | ~/virtualenv/<app-root>/<version>/bin/activate |
| Installed packages | ~/virtualenv/<app-root>/<version>/lib/... |
| Restart trigger | ~/<app-root>/tmp/restart.txt |
| Passenger config | ~/<app-root>/.htaccess (Selector-managed) |
| Boot log (if configured) | path you set in Passenger log file |
Common issues
500: 'did not provide an application callable'
500: 'did not provide an application callable'
passenger_wsgi.py doesn’t expose a top-level name application. Either rename your callable to application, or alias it: application = app.ImportError on a package that pip just installed
ImportError on a package that pip just installed
The package was installed against the system Python, not the per-app virtualenv. Run Pip Install from the cPanel UI, or activate the env in SSH first:
source ~/virtualenv/<app>/<ver>/bin/activate.Static files 404 on Django
Static files 404 on Django
Passenger only serves the WSGI app. Run
manage.py collectstatic and serve /static/ directly from Apache. Add to .htaccess:`pip install pandas` (or numpy) runs out of memory
`pip install pandas` (or numpy) runs out of memory
PMEM is ~1 GB. Heavy compiled wheels can OOM. Use prebuilt wheels (the default for pandas / numpy on linux x86_64), avoid
--no-binary, and consider installing one package at a time.Boot times out on a Django app
Boot times out on a Django app
Default Passenger startup timeout is 60 seconds. Long migrations or heavy
INSTALLED_APPS initialization can exceed it. Bump the timeout in .htaccess:Recipes
Deploy Django
Django app, virtualenv, static files.
Deploy Flask
Flask service via
passenger_wsgi.py.Need a hand?
Open a ticket
Best for anything that needs an account check or a config change on our end.
Live chat
Faster for quick questions during business hours.



