]> git.openstreetmap.org Git - chef.git/blob - cookbooks/nominatim/templates/default/nginx.erb
nominatim: allow blocking by email field
[chef.git] / cookbooks / nominatim / templates / default / nginx.erb
1 upstream nominatim_service {
2   server 127.0.0.1:<%= @pools[:www][:port ]%>;
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 $query_string $email_id {
16     ~(^|&)email=([^&]+)  $2;
17 }
18
19 map $email_id $missing_email {
20     default "";
21     "" 1;
22 }
23
24 map $http_user_agent $missing_ua {
25     default "";
26     "" 1;
27 }
28
29 map $http_referer $missing_referer {
30     default "";
31     "" 1;
32 }
33
34 # Whitelisted IPs
35 geo $whitelisted {
36     default 0;
37 <% @frontends.each do |frontend| -%>
38 <% frontend.ipaddresses(:role => :external) do |address| -%>
39     <%= address %> 1;
40 <% end -%>
41 <% end -%>
42     46.235.224.148 1;
43     209.132.180.180 1;
44     209.132.180.168 1;
45     8.43.85.23 1; # gnome
46 }
47
48 map $missing_email$missing_referer$http_user_agent $blocked_user_agent {
49    default 0;
50    "11" 2; # block any requests without identifier
51    include <%= @confdir %>/nginx_blocked_user_agent.conf;
52 }
53
54 map $missing_email$missing_ua$http_referer $blocked_referrer {
55    default 0;
56    include <%= @confdir %>/nginx_blocked_referrer.conf;
57 }
58
59 map $missing_referer$missing_ua$http_referer $blocked_email {
60    default 0;
61    include <%= @confdir %>/nginx_blocked_email.conf;
62 }
63
64 map $whitelisted $limit_www {
65     1 "";
66     0 $binary_remote_addr;
67 }
68
69 map $blocked_user_agent $limit_tarpit {
70     0 "";
71     1 $binary_remote_addr;
72     2 $binary_remote_addr;
73 }
74
75 limit_req_zone $limit_www zone=www:50m rate=2r/s;
76 limit_req_zone $limit_tarpit zone=tarpit:10m rate=1r/s;
77 limit_req_zone $binary_remote_addr zone=blocked:10m rate=20r/m;
78
79 server {
80     listen 80 default_server;
81     listen [::]:80 default_server;
82
83     access_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-access.log combined;
84     error_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-error.log;
85
86     location /nginx_status {
87         stub_status on;
88         access_log   off;
89         allow 127.0.0.1;
90         allow ::1;
91         deny all;
92     }
93
94      rewrite ^/\.well-known/acme-challenge/(.*)$ http://acme.openstreetmap.org/.well-known/acme-challenge/$1 permanent;
95
96      location / {
97          return 301 https://$host$request_uri;
98      }
99 }
100
101 server {
102     # IPv4
103     listen       443 ssl deferred backlog=16384 reuseport fastopen=2048 http2 default_server;
104     # IPv6
105     listen       [::]:443 ssl deferred backlog=16384 reuseport fastopen=2048 http2 default_server;
106     server_name  localhost;
107
108     ssl_certificate /etc/ssl/certs/<%= node[:fqdn] %>.pem;
109     ssl_certificate_key /etc/ssl/private/<%= node[:fqdn] %>.key;
110
111     root <%= @directory %>/website;
112     index search.php;
113
114     access_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-access.log combined;
115     error_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-error.log;
116
117     location /nginx_status {
118         stub_status on;
119         access_log   off;
120         allow 127.0.0.1;
121         allow ::1;
122         deny all;
123     }
124
125     error_page 403 /403.html;
126     location /403.html {
127         limit_req zone=blocked burst=5;
128     }
129
130     error_page 429 /509.html;
131     location /509.html {
132         limit_req zone=blocked burst=5;
133     }
134
135     location / {
136         if ($blocked_user_agent ~ ^2$)
137         { return 403; }
138         if ($blocked_referrer)
139         { return 403; }
140         if ($blocked_email)
141         { return 403; }
142
143         try_files $uri $uri/ @php;
144     }
145
146     location @php {
147         limit_req zone=www burst=10;
148         limit_req zone=tarpit burst=2;
149         limit_req_status 429;
150         fastcgi_pass nominatim_service;
151         include fastcgi_params;
152         fastcgi_param QUERY_STRING    $args;
153         fastcgi_param PATH_INFO       "$nominatim_path_info";
154         fastcgi_param SCRIPT_FILENAME  "$document_root/$nominatim_script_name";
155     }
156
157     location ~* \.php$ {
158         limit_req zone=www burst=10;
159         limit_req zone=tarpit burst=2;
160         limit_req_status 429;
161         fastcgi_pass    nominatim_service;
162         include         fastcgi_params;
163         fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
164     }
165 }