From: Sarah Hoffmann Date: Wed, 16 Sep 2020 09:19:38 +0000 (+0200) Subject: restructure webserver setup in ubuntu 18 script X-Git-Tag: v3.6.0~77^2~4 X-Git-Url: https://git.openstreetmap.org/nominatim.git/commitdiff_plain/91219bb3dd7c82ce0875dc7213e8eb4d172af313 restructure webserver setup in ubuntu 18 script Unify the two vagrant scripts for Ubuntu 18. The script can now be run in three modes: no webserver, with apache, with nginx. The default mode is to not install any webserver at all. This is normally sufficient when just developping. The commit also switches from bento to generic boxes and adds config for running with a libvirt provider. You need an NFS deamon for synchronized folders. --- diff --git a/Vagrantfile b/Vagrantfile index 87118c43..dff597d6 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -4,18 +4,38 @@ Vagrant.configure("2") do |config| # Apache webserver config.vm.network "forwarded_port", guest: 80, host: 8089 + config.vm.network "forwarded_port", guest: 8088, host: 8088 # If true, then any SSH connections made will enable agent forwarding. config.ssh.forward_agent = true + # Never sync the current directory to /vagrant. + config.vm.synced_folder ".", "/vagrant", disabled: true + + checkout = "yes" - if ENV['CHECKOUT'] != 'y' then + + config.vm.provider "virtualbox" do |vb| + vb.gui = false + vb.memory = 2048 + vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate//vagrant","0"] + if ENV['CHECKOUT'] != 'y' then config.vm.synced_folder ".", "/home/vagrant/Nominatim" checkout = "no" + end + end + + config.vm.provider "libvirt" do |lv| + lv.memory = 2048 + lv.nested = true + if ENV['CHECKOUT'] != 'y' then + config.vm.synced_folder ".", "/home/vagrant/Nominatim", type: 'nfs' + checkout = "no" + end end config.vm.define "ubuntu", primary: true do |sub| - sub.vm.box = "bento/ubuntu-20.04" + sub.vm.box = "generic/ubuntu2004" sub.vm.provision :shell do |s| s.path = "vagrant/Install-on-Ubuntu-20.sh" s.privileged = false @@ -23,8 +43,8 @@ Vagrant.configure("2") do |config| end end - config.vm.define "ubuntu18", primary: true do |sub| - sub.vm.box = "bento/ubuntu-18.04" + config.vm.define "ubuntu18" do |sub| + sub.vm.box = "generic/ubuntu1804" sub.vm.provision :shell do |s| s.path = "vagrant/Install-on-Ubuntu-18.sh" s.privileged = false @@ -32,30 +52,21 @@ Vagrant.configure("2") do |config| end end - config.vm.define "ubuntu18nginx" do |sub| - sub.vm.box = "bento/ubuntu-18.04" - sub.vm.provision :shell do |s| - s.path = "vagrant/Install-on-Ubuntu-18-nginx.sh" - s.privileged = false - s.args = [checkout] - end - end - - config.vm.define "ubuntu16" do |sub| - sub.vm.box = "bento/ubuntu-16.04" + config.vm.define "ubuntu18-apache" do |sub| + sub.vm.box = "generic/ubuntu1804" sub.vm.provision :shell do |s| - s.path = "vagrant/Install-on-Ubuntu-16.sh" + s.path = "vagrant/Install-on-Ubuntu-18.sh" s.privileged = false - s.args = [checkout] + s.args = [checkout, "install-apache"] end end - config.vm.define "travis" do |sub| - sub.vm.box = "bento/ubuntu-14.04" + config.vm.define "ubuntu18-nginx" do |sub| + sub.vm.box = "generic/ubuntu1804" sub.vm.provision :shell do |s| - s.path = "vagrant/install-on-travis-ci.sh" + s.path = "vagrant/Install-on-Ubuntu-18.sh" s.privileged = false - s.args = [checkout] + s.args = [checkout, "install-nginx"] end end @@ -67,7 +78,6 @@ Vagrant.configure("2") do |config| s.args = "yes" end sub.vm.synced_folder ".", "/home/vagrant/Nominatim", disabled: true - sub.vm.synced_folder ".", "/vagrant", disabled: true end config.vm.define "centos8" do |sub| @@ -78,14 +88,7 @@ Vagrant.configure("2") do |config| s.args = "yes" end sub.vm.synced_folder ".", "/home/vagrant/Nominatim", disabled: true - sub.vm.synced_folder ".", "/vagrant", disabled: true end - config.vm.provider "virtualbox" do |vb| - vb.gui = false - vb.memory = 2048 - vb.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate//vagrant","0"] - end - end diff --git a/vagrant/Install-on-Ubuntu-18-nginx.sh b/vagrant/Install-on-Ubuntu-18-nginx.sh deleted file mode 100755 index 382df6b2..00000000 --- a/vagrant/Install-on-Ubuntu-18-nginx.sh +++ /dev/null @@ -1,121 +0,0 @@ -#!/bin/bash - -# -# This is variation of Install-on-Ubuntu.sh showcasing how to use the -# nginx webserver instead of Apache2. We might eventually merge both -# files. Right now expect this file to become outdated/unmaintained -# over time. -# -# This file lacks many comments found in Install-on-Ubuntu.sh, you -# should check that file first to get a basic understanding. -# - -# hacks for broken vagrant box -sudo rm -f /var/lib/dpkg/lock -sudo update-locale LANG=en_US.UTF-8 -export APT_LISTCHANGES_FRONTEND=none -export DEBIAN_FRONTEND=noninteractive - - sudo apt-get update -qq - sudo apt-get install -y build-essential cmake g++ libboost-dev libboost-system-dev \ - libboost-filesystem-dev libexpat1-dev zlib1g-dev\ - libbz2-dev libpq-dev libproj-dev \ - postgresql-server-dev-10 postgresql-10-postgis-2.4 \ - postgresql-contrib-10 \ - nginx php-fpm php php-pgsql \ - php-intl python3-setuptools python3-dev python3-pip \ - python3-psycopg2 python3-tidylib git - - export USERNAME=vagrant - export USERHOME=/home/vagrant - - chmod a+x $USERHOME - -# Setting up PostgreSQL -# --------------------- -# -# Tune the postgresql configuration, see same section in Install-on-Ubuntu.sh - - sudo systemctl restart postgresql - - sudo -u postgres createuser -s $USERNAME - sudo -u postgres createuser www-data - -# -# Setting up the Nginx Webserver -# ------------------------------- -# -# You need to configure php-fpm to listen on a Unix socket. Then create Nginx -# configuration to forward localhost:80 requests to that socket. -# - - -sudo tee /etc/php/7.2/fpm/pool.d/www.conf << EOF_PHP_FPM_CONF -[www] -; Comment out the tcp listener and add the unix socket -;listen = 127.0.0.1:9000 -listen = /var/run/php7.2-fpm.sock - -; Ensure that the daemon runs as the correct user -listen.owner = www-data -listen.group = www-data -listen.mode = 0666 - -; Unix user of FPM processes -user = www-data -group = www-data - -; Choose process manager type (static, dynamic, ondemand) -pm = ondemand -pm.max_children = 5 -EOF_PHP_FPM_CONF - - - - -sudo tee /etc/nginx/sites-available/default << EOF_NGINX_CONF -server { - listen 80 default_server; - listen [::]:80 default_server; - - root $USERHOME/build/website; - index search.php index.html; - 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.2-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/php/php7.2-fpm.sock; - fastcgi_index search.php; - include fastcgi.conf; - } -} -EOF_NGINX_CONF - - -sudo sed -i 's:#.*::' /etc/nginx/sites-available/default - - -# -# Enable the configuration and restart Nginx -# - - sudo systemctl stop apache2 # just in case it's installed as well - sudo systemctl restart php7.2-fpm nginx - -# From here continue in the 'Installing Nominatim' section in -# Install-on-Ubuntu.sh - diff --git a/vagrant/Install-on-Ubuntu-18.sh b/vagrant/Install-on-Ubuntu-18.sh index 34e6aaa0..52f01715 100755 --- a/vagrant/Install-on-Ubuntu-18.sh +++ b/vagrant/Install-on-Ubuntu-18.sh @@ -18,20 +18,19 @@ export DEBIAN_FRONTEND=noninteractive #DOCS: # Make sure all packages are are up-to-date by running: # -#DOCS: :::sh sudo apt-get -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" --force-yes -fuy install grub-pc #DOCS: - sudo apt-get update -qq + sudo apt update -qq # Now you can install all packages needed for Nominatim: - sudo apt-get install -y build-essential cmake g++ libboost-dev libboost-system-dev \ - libboost-filesystem-dev libexpat1-dev zlib1g-dev\ - libbz2-dev libpq-dev libproj-dev \ - postgresql-server-dev-10 postgresql-10-postgis-2.4 \ - postgresql-contrib-10 postgresql-10-postgis-scripts \ - apache2 php php-pgsql libapache2-mod-php \ - php-intl python3-setuptools python3-dev python3-pip \ - python3-psycopg2 python3-tidylib git + sudo apt install -y php-cgi + sudo apt install -y build-essential cmake g++ libboost-dev libboost-system-dev \ + libboost-filesystem-dev libexpat1-dev zlib1g-dev\ + libbz2-dev libpq-dev libproj-dev \ + postgresql-server-dev-10 postgresql-10-postgis-2.4 \ + postgresql-contrib-10 postgresql-10-postgis-scripts \ + php php-pgsql php-intl \ + python3-psycopg2 git # @@ -87,35 +86,6 @@ export DEBIAN_FRONTEND=noninteractive #DOCS: sudo -u postgres createuser -s $USERNAME sudo -u postgres createuser www-data -# -# Setting up the Apache Webserver -# ------------------------------- -# -# You need to create an alias to the website directory in your apache -# configuration. Add a separate nominatim configuration to your webserver: - -#DOCS:```sh -sudo tee /etc/apache2/conf-available/nominatim.conf << EOFAPACHECONF - #DOCS: - Options FollowSymLinks MultiViews - AddType text/html .php - DirectoryIndex search.php - Require all granted - - -Alias /nominatim $USERHOME/build/website #DOCS:Alias /nominatim $USERHOME/Nominatim/build/website -EOFAPACHECONF -#DOCS:``` - -sudo sed -i 's:#.*::' /etc/apache2/conf-available/nominatim.conf #DOCS: - -# -# Then enable the configuration and restart apache -# - - sudo a2enconf nominatim - sudo systemctl restart apache2 - # # Installing Nominatim # ==================== @@ -143,12 +113,53 @@ fi #DOCS: # The code must be built in a separate directory. Create this directory, # then configure and build Nominatim in there: - cd $USERHOME #DOCS: :::sh + cd $USERHOME mkdir build cd build cmake $USERHOME/Nominatim make + +# Nominatim is now ready to use. You can continue with +# [importing a database from OSM data](../admin/Import.md). If you want to set up +# a webserver first, continue reading. +# +# Setting up a webserver +# ====================== +# +# Option 1: Using Apache +# ---------------------- +# +if [ "x$2" == "xinstall-apache" ]; then #DOCS: +# +# Apache has a PHP module that can be used to serve Nominatim. To install them +# run: + + sudo apt install -y apache2 libapache2-mod-php + +# You need to create an alias to the website directory in your apache +# configuration. Add a separate nominatim configuration to your webserver: + +#DOCS:```sh +sudo tee /etc/apache2/conf-available/nominatim.conf << EOFAPACHECONF + + Options FollowSymLinks MultiViews + AddType text/html .php + DirectoryIndex search.php + Require all granted + + +Alias /nominatim $USERHOME/build/website +EOFAPACHECONF +#DOCS:``` + +# +# Then enable the configuration and restart apache +# + + sudo a2enconf nominatim + sudo systemctl restart apache2 + # You need to create a minimal configuration file that tells nominatim # where it is located on the webserver: @@ -159,6 +170,88 @@ tee settings/local.php << EOF EOF #DOCS:``` +# The Nominatim API is now available at `http://localhost/nominatim/`. + +fi #DOCS: + +# +# Option 2: Using nginx +# --------------------- +# +if [ "x$2" == "xinstall-nginx" ]; then #DOCS: + +# Nginx has no native support for php scripts. You need to set up php-fpm for +# this purpose. First install nginx and php-fpm: + + sudo apt install -y nginx php-fpm + +# You need to configure php-fpm to listen on a Unix socket. + +#DOCS:```sh +sudo tee /etc/php/7.2/fpm/pool.d/www.conf << EOF_PHP_FPM_CONF +[www] +; Replace the tcp listener and add the unix socket +listen = /var/run/php7.2-fpm.sock + +; Ensure that the daemon runs as the correct user +listen.owner = www-data +listen.group = www-data +listen.mode = 0666 + +; Unix user of FPM processes +user = www-data +group = www-data + +; Choose process manager type (static, dynamic, ondemand) +pm = ondemand +pm.max_children = 5 +EOF_PHP_FPM_CONF +#DOCS:``` + +# Then create a Nginx configuration to forward http requests to that socket. + +#DOCS:```sh +sudo tee /etc/nginx/sites-available/default << EOF_NGINX_CONF +server { + listen 80 default_server; + listen [::]:80 default_server; + + root $USERHOME/build/website; + index search.php index.html; + 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/php7.2-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.2-fpm.sock; + fastcgi_index search.php; + include fastcgi.conf; + } +} +EOF_NGINX_CONF +#DOCS:``` + +# +# Enable the configuration and restart Nginx +# + + sudo systemctl restart php7.2-fpm nginx + +# The Nominatim API is now available at `http://localhost/`. + + -# Nominatim is now ready to use. Continue with -# [importing a database from OSM data](../admin/Import.md). +fi #DOCS: