Troubleshooting
<slideshow style="nobleprog" headingmark="⌘" incmark="…" scaled="true" font="Trebuchet MS" >
- title
- Troubleshooting
- author
- Bernard Szlachta (NobleProg Ltd)
</slideshow>
Troubleshooting ⌘
- Before you assume it's an nginx problem, take a step back and look at the issue
- Automated script to help problem diagnosis - What's Wrong?
nginx Troubleshooting ⌘
- Always syntax check your config
service nginx configtest
- Check the error log
- By default, /var/log/nginx/error_log
nginx error logs ⌘
- Can sometimes be a little cryptic
- Google helps of course..
Common errors (1) ⌘
2012/11/29 06:31:42 [error] 2589#0: *6437 client intended to send too large body: 13106010 bytes, client: 127.0.0.1, server: , request: "POST /upload/ HTTP/1.1", host: "www.example.com", referrer: "http://www.example.com/file_upload/"
- Client attempted to upload a file bigger than the maximum POST size
Common errors (1) ⌘
2012/11/29 06:31:42 [error] 2589#0: *6437 client intended to send too large body: 13106010 bytes, client: 127.0.0.1, server: , request: "POST /upload/ HTTP/1.1", host: "www.example.com", referrer: "http://www.example.com/file_upload/"
Common errors (2) ⌘
2012/10/14 19:51:22 [emerg] 3969#0: "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /etc/nginx/conf.d/proxy.conf:16
Common errors (2)⌘
2012/10/14 19:51:22 [emerg] 3969#0: "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" block in /etc/nginx/conf.d/proxy.conf:16
- nginx won't start to to configuration syntax error
- Line containing error shown
- If you attempted to reload nginx with this config, it will continue to run with the old config
Common errors (3) ⌘
2012/10/14 18:46:54 [emerg] 2593#0: unknown directive "client_body_temp_path" in /etc/nginx/conf.d/vhost.conf:6
Common errors (3) ⌘
2012/10/14 18:46:54 [emerg] 2593#0: unknown directive "client_body_temp_path" in /etc/nginx/conf.d/vhost.conf:6
- client_body_temp_path is actually a valid directive
- .. but it's being used in the wrong place
- Because nginx is modular, each module's directives are known only inside the section that module configures
Common errors (4) ⌘
2012/10/16 20:56:31 [emerg] 3039#0: "try_files" directive is not allowed here in /opt/nginx/conf/vhost.conf:16
Common errors (4) ⌘
2012/10/16 20:56:31 [emerg] 3039#0: "try_files" directive is not allowed here in /etc/nginx/conf.d/vhost.conf:16
- nginx can sometimes hint when you've used something valid for the module, but in the wrong place
Common errors (5) ⌘
2012/10/16 20:56:42 [emerg] 3043#0: host not found in upstream "tickets. example.com" in /opt/nginx/conf.d/proxy.conf:22
Common errors (5) ⌘
2012/10/16 20:56:42 [emerg] 3043#0: host not found in upstream "tickets. example.com" in /opt/nginx/conf.d/proxy.conf:22
- Your configuration is valid, but there is a DNS problem looking up
tickets.example.com
Common errors (6) ⌘
2012/10/29 18:59:26 [emerg] 2287#0: unexpected "}" in /etc/nginx/conf.d/ vhost.conf:40
Common errors (6) ⌘
2012/10/29 18:59:26 [emerg] 2287#0: unexpected "}" in /etc/nginx/conf.d/ vhost.conf:40
- Simple syntax error
- Too many closing brackets
Common errors (7)
2012/10/29 18:59:26 [emerg] 2287#0: unexpected end of file, expecting "}" in /etc/nginx/conf.d/ vhost.conf:40
Common errors (7) ⌘
2012/10/29 18:59:26 [emerg] 2287#0: unexpected end of file, expecting "}" in /etc/nginx/conf.d/ vhost.conf:40
- Simple syntax error
- Insufficient closing brackets
Debugging with custom logs ⌘
- Not sure if a section of config is getting called, or what a variable is set to?
- Log data into the access logs with the `log_format` directive
Debugging with custom logs example ⌘
http {
log_format sentlog '[$time_local] "$request" $status $body_bytes_sent ';
log_format imagelog '[$time_local] $image_file $image_type ' '$body_bytes_sent $status';
log_format authlog '[$time_local] $remote_addr $remote_user ' '"$request" $status';
server {
server_name .example.com;
root /home/www;
location / {
access_log logs/example.com-access.log combined;
access_log logs/example.com-root_access.log sentlog;
rewrite ^/(.*)\.(png|jpg|gif)$ /images/$1.$2;
set $image_file $1;
set $image_type $2;
}
location /images {
access_log logs/example.com-images_access.log imagelog;
}
location /auth {
auth_basic "authorized area";
auth_basic_user_file conf/htpasswd;
deny all;
access_log logs/example.com-auth_access.log authlog;
}
}
}
Miscellaneous ⌘
Be careful what you believe on the Internet ⌘
- nginx still relatively young
- There have been many changes to configuration syntax and features since release
- Many blog/forum posts you will find via Google telling you how to do something are outdated or just plain wrong
Common mis-use ⌘
- Commonly seen on forums/blogs:
location / {
if (!-f $request_filename) {
include fastcgi_params;
proxy_pass 127.0.0.1:8000;
break;
}
}
Common mis-use - the right way ⌘
- A better performing way to achieve the same result:
location / {
try_files $uri $uri/ @proxy;
}
location @proxy {
proxy_pass 127.0.0.1:8000;
}
More commonly seen bad advice ⌘
server {
server_name .example.com;
root /var/www/html;
if ($host ~* ^example\.com) {
rewrite ^/(.*)$ http://www.example.com/$1 redirect;
}
}
The right way ⌘
server {
server_name example.com;
return 301 http://www.example.com;
}
In-place upgrades ⌘
- nginx has a nice feature to switch binaries while running
- installing an upgraded package leaves the old version of nginx running
- simply run `service nginx upgrade` to switch to the new version with 0 downtime
nginx status module ⌘
- nginx has module which can provide status details vi a URL
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
Status module output ⌘
$ curl -s http://localhost/nginx_status Active connections: 2532 server accepts handled requests 1476737983 1476737983 3553635810 Reading: 93 Writing: 13 Waiting: 2426