]> git.openstreetmap.org Git - chef.git/blob - cookbooks/nominatim/templates/default/nginx.erb
Decrease tile rate limit to 30 TPS
[chef.git] / cookbooks / nominatim / templates / default / nginx.erb
1 upstream nominatim_service {
2   server unix:/run/php/nominatim.openstreetmap.org.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.23 1; # gnome
61 }
62
63 map $missing_email$missing_referer$http_user_agent $blocked_user_agent {
64    default 0;
65    "11" 2; # block any requests without identifier
66    include <%= @confdir %>/nginx_blocked_user_agent.conf;
67 }
68
69 map $missing_email$missing_ua$http_referer $blocked_referrer {
70    default 0;
71    include <%= @confdir %>/nginx_blocked_referrer.conf;
72 }
73
74 map $missing_referer$missing_ua$email_id $blocked_email {
75    default 0;
76    include <%= @confdir %>/nginx_blocked_email.conf;
77 }
78
79 map $whitelisted $limit_www {
80     1 "";
81     0 $binary_remote_addr;
82 }
83
84 map $blocked_user_agent $limit_tarpit {
85     0 "";
86     1 $binary_remote_addr;
87     2 $binary_remote_addr;
88 }
89
90 map $missing_email$missing_referer$http_user_agent $generic_mozilla {
91     default 0;
92     ~^11Mozilla/4.0 1;
93     ~^11Mozilla/5.0 2;
94 }
95
96 map $whitelisted$generic_mozilla$uri $limit_reverse {
97     default "";
98     ~01/reverse.*  $binary_remote_addr;
99     ~02/reverse.*  $binary_remote_addr;
100 }
101
102 limit_req_zone $limit_www zone=www:50m rate=2r/s;
103 limit_req_zone $limit_tarpit zone=tarpit:10m rate=1r/s;
104 limit_req_zone $binary_remote_addr zone=blocked:10m rate=20r/m;
105 limit_req_zone $limit_reverse zone=reverse:10m rate=10r/m;
106
107 server {
108     listen 80 default_server;
109     listen [::]:80 default_server;
110
111     access_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-access.log combined;
112     error_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-error.log;
113
114     location /nginx_status {
115         stub_status on;
116         access_log   off;
117         allow 127.0.0.1;
118         allow ::1;
119         deny all;
120     }
121
122      rewrite ^/\.well-known/acme-challenge/(.*)$ http://acme.openstreetmap.org/.well-known/acme-challenge/$1 permanent;
123
124      location / {
125          return 301 https://$host$request_uri;
126      }
127 }
128
129 server {
130     # IPv4
131     listen       443 ssl deferred backlog=16384 reuseport http2 default_server;
132     # IPv6
133     listen       [::]:443 ssl deferred backlog=16384 reuseport http2 default_server;
134     server_name  localhost;
135
136     ssl_certificate /etc/ssl/certs/<%= node[:fqdn] %>.pem;
137     ssl_certificate_key /etc/ssl/private/<%= node[:fqdn] %>.key;
138
139     root <%= @directory %>/website;
140     index search.php;
141
142     access_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-access.log combined;
143     error_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-error.log;
144
145     location /nginx_status {
146         stub_status on;
147         access_log   off;
148         allow 127.0.0.1;
149         allow ::1;
150         deny all;
151     }
152
153     error_page 403 /403.html;
154     location /403.html {
155         limit_req zone=blocked burst=5;
156     }
157
158     error_page 429 /509.html;
159     location /509.html {
160         limit_req zone=blocked burst=5;
161     }
162
163     location / {
164         try_files $uri $uri/ @php;
165     }
166
167     location /ui/ {
168         alias <%= @ui_directory %>/dist/;
169         index search.html;
170     }
171
172     location @php {
173         if ($blocked_user_agent ~ ^2$)
174         { return 403; }
175         if ($blocked_referrer)
176         { return 403; }
177         if ($blocked_email)
178         { return 403; }
179         include <%= @confdir %>/nginx_blocked_generic.conf;
180
181         limit_req zone=www burst=10;
182         limit_req zone=tarpit burst=5;
183         limit_req zone=reverse burst=5;
184         limit_req_status 429;
185         fastcgi_pass nominatim_service;
186         include fastcgi_params;
187         fastcgi_param QUERY_STRING    $args;
188         fastcgi_param PATH_INFO       "$nominatim_path_info";
189         fastcgi_param SCRIPT_FILENAME  "$document_root/$nominatim_script_name";
190         if ($forward_to_ui) {
191             rewrite ^(/[^/]*) https://$host/ui$1.html redirect;
192         }
193     }
194
195     location ~* \.php$ {
196         if ($blocked_user_agent ~ ^2$)
197         { return 403; }
198         if ($blocked_referrer)
199         { return 403; }
200         if ($blocked_email)
201         { return 403; }
202         include <%= @confdir %>/nginx_blocked_generic.conf;
203
204         limit_req zone=www burst=10;
205         limit_req zone=tarpit burst=2;
206         limit_req zone=reverse burst=5;
207         limit_req_status 429;
208         fastcgi_pass    nominatim_service;
209         include         fastcgi_params;
210         fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
211
212         if ($forward_to_ui) {
213             rewrite (.*).php https://$host/ui$1.html redirect;
214         }
215     }
216 }