1 # Deploying the Nominatim Python frontend
 
   3 Nominatim can be run as a Python-based
 
   4 [ASGI web application](https://asgi.readthedocs.io/en/latest/). You have the
 
   5 choice between [Falcon](https://falcon.readthedocs.io/en/stable/)
 
   6 and [Starlette](https://www.starlette.io/) as the ASGI framework.
 
   8 This section gives a quick overview on how to configure Nginx to serve
 
   9 Nominatim. Please refer to the documentation of
 
  10 [Nginx](https://nginx.org/en/docs/) for background information on how
 
  14     Throughout this page, we assume your Nominatim project directory is
 
  15     located in `/srv/nominatim-project`. If you have put it somewhere else,
 
  16     you need to adjust the commands and configuration accordingly.
 
  19 ### Installing the required packages
 
  21 The Nominatim frontend is best run from its own virtual environment. If
 
  22 you have already created one for the database backend during the
 
  23 [installation](Installation.md#building-nominatim), you can use that. Otherwise
 
  27 sudo apt-get install virtualenv
 
  28 virtualenv /srv/nominatim-venv
 
  31 The Nominatim frontend is contained in the 'nominatim-api' package. To
 
  32 install directly from the source tree run:
 
  36 /srv/nominatim-venv/bin/pip install packaging/nominatim-api
 
  39 The recommended way to deploy a Python ASGI application is to run
 
  40 the ASGI runner [uvicorn](https://uvicorn.org/)
 
  41 together with [gunicorn](https://gunicorn.org/) HTTP server. We use
 
  42 Falcon here as the web framework.
 
  44 Add the necessary packages to your virtual environment:
 
  47 /srv/nominatim-venv/bin/pip install falcon uvicorn gunicorn
 
  50 ### Setting up Nominatim as a systemd job
 
  52 Next you need to set up the service that runs the Nominatim frontend. This is
 
  53 easiest done with a systemd job.
 
  55 First you need to tell systemd to create a socket file to be used by
 
  56 hunicorn. Create the following file `/etc/systemd/system/nominatim.socket`:
 
  60 Description=Gunicorn socket for Nominatim
 
  63 ListenStream=/run/nominatim.sock
 
  67 WantedBy=multi-user.target
 
  70 Now you can add the systemd service for Nominatim itself.
 
  71 Create the following file `/etc/systemd/system/nominatim.service`:
 
  75 Description=Nominatim running as a gunicorn application
 
  77 Requires=nominatim.socket
 
  83 WorkingDirectory=/srv/nominatim-project
 
  84 ExecStart=/srv/nominatim-venv/bin/gunicorn -b unix:/run/nominatim.sock -w 4 -k uvicorn.workers.UvicornWorker nominatim_api.server.falcon.server:run_wsgi
 
  85 ExecReload=/bin/kill -s HUP $MAINPID
 
  86 StandardOutput=append:/var/log/gunicorn-nominatim.log
 
  93 WantedBy=multi-user.target
 
  96 This sets up gunicorn with 4 workers (`-w 4` in ExecStart). Each worker runs
 
  97 its own Python process using
 
  98 [`NOMINATIM_API_POOL_SIZE`](../customize/Settings.md#nominatim_api_pool_size)
 
  99 connections to the database to serve requests in parallel.
 
 101 Make the new services known to systemd and start it:
 
 104 sudo systemctl daemon-reload
 
 105 sudo systemctl enable nominatim.socket
 
 106 sudo systemctl start nominatim.socket
 
 107 sudo systemctl enable nominatim.service
 
 108 sudo systemctl start nominatim.service
 
 111 This sets the service up, so that Nominatim is automatically started
 
 114 ### Configuring nginx
 
 116 To make the service available to the world, you need to proxy it through
 
 117 nginx. Add the following definition to the default configuration:
 
 120 upstream nominatim_service {
 
 121   server unix:/run/nominatim.sock fail_timeout=0;
 
 132             proxy_set_header Host $http_host;
 
 133             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
 134             proxy_set_header X-Forwarded-Proto $scheme;
 
 136             proxy_pass http://nominatim_service;
 
 144 sudo systemctl reload nginx
 
 147 and you should be able to see the status of your server under
 
 148 `http://localhost/status`.