]> git.openstreetmap.org Git - nominatim.git/blobdiff - docs/admin/Installation.md
Merge remote-tracking branch 'upstream/master'
[nominatim.git] / docs / admin / Installation.md
index ce7fb412fff8ab69d333a8501e2d488d7c8797f6..cf994c4c7a6b8fe7c4cc27d59d30fb55d09b4d88 100644 (file)
+# Basic Installation
+
 This page contains generic installation instructions for Nominatim and its
 prerequisites. There are also step-by-step instructions available for
 the following operating systems:
 
-  * [Ubuntu 16.04](../appendix/Install-on-Ubuntu-16.md)
+  * [Ubuntu 20.04](../appendix/Install-on-Ubuntu-20.md)
+  * [Ubuntu 18.04](../appendix/Install-on-Ubuntu-18.md)
+  * [CentOS 8](../appendix/Install-on-Centos-8.md)
   * [CentOS 7.2](../appendix/Install-on-Centos-7.md)
 
 These OS-specific instructions can also be found in executable form
 in the `vagrant/` directory.
 
-# Prerequisites
+Users have created instructions for other frameworks. We haven't tested those
+and can't offer support.
 
-## Software
+  * [Docker](https://github.com/mediagis/nominatim-docker)
+  * [Docker on Kubernetes](https://github.com/peter-evans/nominatim-k8s)
+  * [Ansible](https://github.com/synthesio/infra-ansible-nominatim)
 
-For compiling:
+## Prerequisites
 
-  * [cmake](https://cmake.org/)
-  * [libxml2](http://xmlsoft.org/)
-  * a recent C++ compiler
+### Software
 
-Nominatim comes with its own version of osm2pgsql. See the
-osm2pgsql README for additional dependencies required for compiling osm2pgsql.
-
-For running tests:
+For compiling:
 
-  * [behave](http://pythonhosted.org/behave/)
-  * [Psycopg2](http://initd.org/psycopg)
-  * [nose](https://nose.readthedocs.io)
-  * [phpunit](https://phpunit.de)
+  * [cmake](https://cmake.org/)
+  * [expat](https://libexpat.github.io/)
+  * [proj](https://proj.org/)
+  * [bzip2](http://www.bzip.org/)
+  * [zlib](https://www.zlib.net/)
+  * [Boost libraries](https://www.boost.org/), including system and filesystem
+  * PostgreSQL client libraries
+  * a recent C++ compiler (gcc 5+ or Clang 3.8+)
 
 For running Nominatim:
 
-  * [PostgreSQL](http://www.postgresql.org) (9.1 or later)
-  * [PostGIS](http://postgis.refractions.net) (2.0 or later)
-  * [PHP](http://php.net) (5.4 or later)
+  * [PostgreSQL](https://www.postgresql.org) (9.3+)
+  * [PostGIS](https://postgis.org) (2.2+)
+  * [Python 3](https://www.python.org/)
+  * [Psycopg2](https://initd.org/psycopg)
+  * [PHP](https://php.net) (7.0 or later)
   * PHP-pgsql
   * PHP-intl (bundled with PHP)
-  * [PEAR::DB](http://pear.php.net/package/DB)
   * a webserver (apache or nginx are recommended)
 
 For running continuous updates:
 
-  * [pyosmium](http://osmcode.org/pyosmium/)
+  * [pyosmium](https://osmcode.org/pyosmium/) (with Python 3)
 
-## Hardware
+For running tests:
+
+  * [behave](http://pythonhosted.org/behave/)
+  * [nose](https://nose.readthedocs.io)
+  * [phpunit](https://phpunit.de) >= 7.3
+
+### Hardware
 
 A minimum of 2GB of RAM is required or installation will fail. For a full
-planet import 32GB of RAM or more strongly are recommended.
+planet import 64GB of RAM or more are strongly recommended. Do not report
+out of memory problems if you have less than 64GB RAM.
 
-For a full planet install you will need about 600GB of hard disk space (as of
-January 2017, take into account that the OSM database is growing fast). SSD disks
+For a full planet install you will need at least 800GB of hard disk space
+(take into account that the OSM database is growing fast). SSD disks
 will help considerably to speed up import and queries.
 
-On a 6-core machine with 32GB RAM and SSDs the import of a full planet takes
-a bit more than 2 days. Without SSDs 7-8 days are more realistic.
-
+Even on a well configured machine the import of a full planet takes
+at least 2 days. Without SSDs 7-8 days are more realistic.
 
-# Setup of the server
+## Setup of the server
 
-## PostgreSQL tuning
+### PostgreSQL tuning
 
 You might want to tune your PostgreSQL installation so that the later steps
 make best use of your hardware. You should tune the following parameters in
 your `postgresql.conf` file.
 
-    shared_buffers (2GB)
-    maintenance_work_mem (10GB)
-    work_mem (50MB)
-    effective_cache_size (24GB)
+    shared_buffers = 2GB
+    maintenance_work_mem = (10GB)
+    autovacuum_work_mem = 2GB
+    work_mem = (50MB)
+    effective_cache_size = (24GB)
     synchronous_commit = off
     checkpoint_segments = 100 # only for postgresql <= 9.4
+    max_wal_size = 1GB # postgresql > 9.4
     checkpoint_timeout = 10min
     checkpoint_completion_target = 0.9
 
 The numbers in brackets behind some parameters seem to work fine for
-32GB RAM machine. Adjust to your setup.
+64GB RAM machine. Adjust to your setup. A higher number for `max_wal_size`
+means that PostgreSQL needs to run checkpoints less often but it does require
+the additional space on your disk.
+
+Autovacuum must not be switched off because it ensures that the
+tables are frequently analysed. If your machine has very little memory,
+you might consider setting:
+
+    autovacuum_max_workers = 1
+
+and even reduce `autovacuum_work_mem` further. This will reduce the amount
+of memory that autovacuum takes away from the import process.
 
 For the initial import, you should also set:
 
@@ -81,27 +107,29 @@ For the initial import, you should also set:
     full_page_writes = off
 
 Don't forget to reenable them after the initial import or you risk database
-corruption. Autovacuum must not be switched off because it ensures that the
-tables are frequently analysed.
+corruption.
+
 
-## Webserver setup
+### Webserver setup
 
 The `website/` directory in the build directory contains the configured
 website. Include the directory into your webbrowser to serve php files
 from there.
 
-### Configure for use with Apache
+#### Configure for use with Apache
 
 Make sure your Apache configuration contains the required permissions for the
 directory and create an alias:
 
-    <Directory "/srv/nominatim/build/website">
-      Options FollowSymLinks MultiViews
-      AddType text/html   .php
-      DirectoryIndex search.php
-      Require all granted
-    </Directory>
-    Alias /nominatim /srv/nominatim/build/website
+``` apache
+<Directory "/srv/nominatim/build/website">
+  Options FollowSymLinks MultiViews
+  AddType text/html   .php
+  DirectoryIndex search.php
+  Require all granted
+</Directory>
+Alias /nominatim /srv/nominatim/build/website
+```
 
 `/srv/nominatim/build` should be replaced with the location of your
 build directory.
@@ -109,7 +137,7 @@ build directory.
 After making changes in the apache config you need to restart apache.
 The website should now be available on http://localhost/nominatim.
 
-### Configure for use with Nginx
+#### Configure for use with Nginx
 
 Use php-fpm as a deamon for serving PHP cgi. Install php-fpm together with nginx.
 
@@ -129,17 +157,32 @@ follows:
 Tell nginx that php files are special and to fastcgi_pass to the php-fpm
 unix socket by adding the location definition to the default configuration.
 
-    root /srv/nominatim/build/website;
-    index search.php index.html;
-    location ~ [^/]\.php(/|$) {
-        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
-        if (!-f $document_root$fastcgi_script_name) {
-            return 404;
-        }
-        fastcgi_pass unix:/var/run/php5-fpm.sock;
-        fastcgi_index search.php;
-        include fastcgi.conf;
+``` nginx
+root /srv/nominatim/build/website;
+index search.php;
+location / {
+    try_files $uri $uri/ @php;
+}
+
+location @php {
+    fastcgi_param SCRIPT_FILENAME "$document_root$uri.php";
+    fastcgi_param PATH_TRANSLATED "$document_root$uri.php";
+    fastcgi_param QUERY_STRING    $args;
+    fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
+    fastcgi_index index.php;
+    include fastcgi_params;
+}
+
+location ~ [^/]\.php(/|$) {
+    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
+    if (!-f $document_root$fastcgi_script_name) {
+        return 404;
     }
+    fastcgi_pass unix:/var/run/php7.3-fpm.sock;
+    fastcgi_index search.php;
+    include fastcgi.conf;
+}
+```
 
 Restart the nginx and php5-fpm services and the website should now be available
 at `http://localhost/`.