]> git.openstreetmap.org Git - chef.git/blob - cookbooks/nominatim/templates/default/nginx.erb
af639e8d0090a78cc73712fe747a723dee45b9df
[chef.git] / cookbooks / nominatim / templates / default / nginx.erb
1 upstream nominatim_service {
2   server unix:/run/php/php-nominatim.openstreetmap.org-fpm.sock;
3 }
4
5 map $uri $nominatim_script_name {
6     ~^(.+?\.php)         $1;
7     ~^/([^/]+)           $1.php;
8     ^$                   search.php;
9 }
10
11 map $uri $nominatim_path_info {
12     ~^/([^/]+)(.*)$      $2;
13 }
14
15 map $args $format {
16     default                  default;
17     ~(^|&)format=html(&|$)   html;
18     ~(^|&)format=            other;
19 }
20
21 map $uri/$format $forward_to_ui {
22     default               1;
23     ~^/ui                 0;
24     ~/other$              0;
25     ~/reverse.*/default   0;
26     ~/lookup.*/default    0;
27     ~/status.*/default    0;
28 }
29
30 map $query_string $email_id {
31     ~(^|&)email=([^&]+)  $2;
32 }
33
34 map $email_id $missing_email {
35     default "";
36     "" 1;
37 }
38
39 map $http_user_agent $missing_ua {
40     default "";
41     "" 1;
42 }
43
44 map $http_referer $missing_referer {
45     default "";
46     "" 1;
47 }
48
49 # Whitelisted IPs
50 geo $whitelisted {
51     default 0;
52 <% @frontends.each do |frontend| -%>
53 <% frontend.ipaddresses(:role => :external).sort.each do |address| -%>
54     <%= address %> 1;
55 <% end -%>
56 <% end -%>
57     46.235.224.148 1;
58     209.132.180.180 1;
59     209.132.180.168 1;
60     8.43.85.3 1; # gnome
61     8.43.85.4 1; # gnome
62     8.43.85.5 1; # gnome
63 }
64
65 map $missing_email$missing_referer$http_user_agent $blocked_user_agent {
66    default 0;
67    "11" 2; # block any requests without identifier
68    include <%= @confdir %>/nginx_blocked_user_agent.conf;
69 }
70
71 map $missing_email$missing_ua$http_referer $blocked_referrer {
72    default 0;
73    include <%= @confdir %>/nginx_blocked_referrer.conf;
74 }
75
76 map $missing_referer$missing_ua$email_id $blocked_email {
77    default 0;
78    include <%= @confdir %>/nginx_blocked_email.conf;
79 }
80
81 map $whitelisted $limit_www {
82     1 "";
83     0 $binary_remote_addr;
84 }
85
86 map $blocked_user_agent $limit_tarpit {
87     0 "";
88     1 $binary_remote_addr;
89     2 $binary_remote_addr;
90 }
91
92 map $missing_email$missing_referer$http_user_agent $generic_mozilla {
93     default 0;
94     ~^11Mozilla/4.0 1;
95     ~^11Mozilla/5.0 2;
96 }
97
98 map $whitelisted$generic_mozilla$uri $limit_reverse {
99     default "";
100     ~01/reverse.*  $binary_remote_addr;
101     ~02/reverse.*  $binary_remote_addr;
102 }
103
104 limit_req_zone $limit_www zone=www:50m rate=2r/s;
105 limit_req_zone $limit_tarpit zone=tarpit:10m rate=1r/s;
106 limit_req_zone $binary_remote_addr zone=blocked:10m rate=20r/m;
107 limit_req_zone $limit_reverse zone=reverse:10m rate=10r/m;
108
109 server {
110     listen 80 default_server;
111     listen [::]:80 default_server;
112
113     access_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-access.log combined;
114     error_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-error.log;
115
116     location /nginx_status {
117         stub_status on;
118         access_log   off;
119         allow 127.0.0.1;
120         allow ::1;
121         deny all;
122     }
123
124      rewrite ^/\.well-known/acme-challenge/(.*)$ http://acme.openstreetmap.org/.well-known/acme-challenge/$1 permanent;
125
126      location / {
127          return 301 https://$host$request_uri;
128      }
129 }
130
131 server {
132     # IPv4
133     listen       443 ssl http2 default_server;
134     # IPv6
135     listen       [::]:443 ssl http2 default_server;
136     server_name  localhost;
137
138     ssl_certificate /etc/ssl/certs/<%= node[:fqdn] %>.pem;
139     ssl_certificate_key /etc/ssl/private/<%= node[:fqdn] %>.key;
140
141     root <%= @directory %>/website;
142     index search.php;
143
144     access_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-access.log combined;
145     error_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-error.log;
146
147     location /nginx_status {
148         stub_status on;
149         access_log   off;
150         allow 127.0.0.1;
151         allow ::1;
152         deny all;
153     }
154
155     error_page 403 /403.html;
156     location /403.html {
157         limit_req zone=blocked burst=5;
158     }
159
160     error_page 429 /509.html;
161     location /509.html {
162         limit_req zone=blocked burst=5;
163     }
164
165     location / {
166         try_files $uri $uri/ @php;
167     }
168
169     location /ui/ {
170         alias <%= @ui_directory %>/dist/;
171         index search.html;
172     }
173
174     location /qa-data/ {
175         add_header Access-Control-Allow-Origin "*" always;
176     }
177
178     location @php {
179         if ($blocked_user_agent ~ ^2$)
180         { return 403; }
181         if ($blocked_referrer)
182         { return 403; }
183         if ($blocked_email)
184         { return 403; }
185         include <%= @confdir %>/nginx_blocked_generic.conf;
186
187         limit_req zone=www burst=10;
188         limit_req zone=tarpit burst=5;
189         limit_req zone=reverse burst=5;
190         limit_req_status 429;
191         fastcgi_pass nominatim_service;
192         include fastcgi_params;
193         fastcgi_param QUERY_STRING    $args;
194         fastcgi_param PATH_INFO       "$nominatim_path_info";
195         fastcgi_param SCRIPT_FILENAME  "$document_root/$nominatim_script_name";
196         if ($forward_to_ui) {
197             rewrite ^(/[^/]*) https://$host/ui$1.html redirect;
198         }
199     }
200
201     location ~* \.php$ {
202         if ($blocked_user_agent ~ ^2$)
203         { return 403; }
204         if ($blocked_referrer)
205         { return 403; }
206         if ($blocked_email)
207         { return 403; }
208         include <%= @confdir %>/nginx_blocked_generic.conf;
209
210         limit_req zone=www burst=10;
211         limit_req zone=tarpit burst=2;
212         limit_req zone=reverse burst=5;
213         limit_req_status 429;
214         fastcgi_pass    nominatim_service;
215         include         fastcgi_params;
216         fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
217
218         if ($forward_to_ui) {
219             rewrite (.*).php https://$host/ui$1.html redirect;
220         }
221     }
222 }