]> git.openstreetmap.org Git - chef.git/blob - cookbooks/nominatim/templates/default/nginx.erb
nominatim: fix limit key for request limiting
[chef.git] / cookbooks / nominatim / templates / default / nginx.erb
1 map $uri $nominatim_script_name {
2     ~^(.+?\.php)         $1;
3     ~^/([^/]+)           $1.php;
4     ^$                   search.php;
5 }
6
7 map $uri $nominatim_path_info {
8     ~^/([^/]+)(.*)$      $2;
9 }
10
11 map $query_string $email_id {
12     ~(^|&)email=([^&]+)  $2;
13 }
14
15 upstream nominatim_service {
16   server 127.0.0.1:<%= @pools[:www][:port ]%>;
17 }
18
19 # Whitelisted IPs
20 geo $whitelisted {
21     default 0;
22     2001:978:2:2c::172:6 1;
23     2001:978:2:2c::172:7 1;
24     2001:978:2:2c::172:8 1;
25     2001:978:2:2c::172:b 1;
26     2001:978:2:2c::172:c 1;
27     2001:978:2:2c::172:d 1;
28     130.117.76.6 1;
29     130.117.76.7 1;
30     130.117.76.8 1;
31     89.16.162.21 1;
32     89.16.162.22 1;
33     46.235.224.148 1;
34     209.132.180.180 1;
35     209.132.180.168 1;
36     8.43.85.23 1; # gnome
37 }
38
39 map $http_user_agent $blocked_user_agent {
40    default 0;
41    include <%= @confdir %>/nginx_blocked_user_agent.conf;
42 }
43
44 map $http_referer $blocked_referrer {
45    default 0;
46    include <%= @confdir %>/nginx_blocked_referrer.conf;
47 }
48
49 map $whitelisted $limit_www {
50     1 "";
51     0 $binary_remote_addr;
52 }
53
54 map $blocked_user_agent $limit_tarpit {
55     0 "";
56     1 $binary_remote_addr;
57     2 $binary_remote_addr;
58 }
59
60 limit_req_zone $limit_www zone=www:50m rate=2r/s;
61 limit_req_zone $limit_tarpit zone=tarpit:10m rate=1r/s;
62 limit_req_zone $binary_remote_addr zone=blocked:10m rate=20r/m;
63
64 server {
65     # IPv4
66     listen       80 deferred backlog=16384 reuseport fastopen=2048 default_server;
67     listen       443 ssl deferred backlog=16384 reuseport fastopen=2048 http2 default_server;
68     # IPv6
69     listen       [::]:80 deferred backlog=16384 reuseport fastopen=2048 default_server;
70     listen       [::]:443 ssl deferred backlog=16384 reuseport fastopen=2048 http2 default_server;
71     server_name  localhost;
72
73     ssl_certificate /etc/ssl/certs/<%= node[:fqdn] %>.pem;
74     ssl_certificate_key /etc/ssl/private/<%= node[:fqdn] %>.key;
75
76     root <%= @directory %>/website;
77     index search.php;
78
79     access_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-access.log combined;
80     error_log <%= node[:nominatim][:logdir] %>/nominatim.openstreetmap.org-error.log;
81
82     location /nginx_status {
83         stub_status on;
84         access_log   off;
85         allow 127.0.0.1;
86         allow ::1;
87         deny all;
88     }
89
90     error_page 403 /403.html;
91     location /403.html {
92         limit_req zone=blocked burst=5;
93     }
94
95     error_page 429 /509.html;
96     location /509.html {
97         limit_req zone=blocked burst=5;
98     }
99
100     location / {
101         set $anyid $http_referer$http_user_agent$email_id;
102         if ($anyid = "")
103         { return 403; }
104         if ($blocked_user_agent ~ ^2$)
105         { return 403; }
106         if ($blocked_referrer)
107         { return 403; }
108
109         try_files $uri $uri/ @php;
110     }
111
112     location @php {
113         limit_req zone=www burst=10;
114         limit_req zone=tarpit burst=2;
115         limit_req_status 429;
116         fastcgi_pass nominatim_service;
117         include fastcgi_params;
118         fastcgi_param QUERY_STRING    $args;
119         fastcgi_param PATH_INFO       "$nominatim_path_info";
120         fastcgi_param SCRIPT_FILENAME  "$document_root/$nominatim_script_name";
121     }
122
123     location ~* \.php$ {
124         limit_req zone=www burst=10;
125         limit_req zone=tarpit burst=2;
126         limit_req_status 429;
127         fastcgi_pass    nominatim_service;
128         include         fastcgi_params;
129         fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
130     }
131 }