I am running Debian Squeeze on a dedicated server, using it as a web- and db-server (nginx, apache & mysql).
I followed a few tutorials on how to setup nginx as a reverse proxy for apache - and most works just fine and I have to say - wow, nginx is very fast.
But, their are also some problems I encountered during "testing". And here we are, at the point I hope someone from serverfault's able to help me. :)
So let me first show you me complete configuration and explain the scenario.
Scenario
To manage clients on the server I am using the ISPConfig Control Panel, configured to handle apache (you can choose between nginx or apache).
Since I don't want that the clients do have to configurate special rewrite rules etc. I am trying to tweak nginx very transparent, meaning it really does only serve static files and all other requests are passed to apache, so rewrite rules etc. still work.
Configuration
What I currently have is:
- a normal apache installation, listening on port 82
mod_rpaf enabled to forward the real IP to apache
nginx installed with the following configuration(s):
/etc/nginx/nginx.conf
user www-data;
worker_processes 4;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 2048;
}
http {
include /etc/nginx/mime.types;
access_log /var/log/nginx/access.log;
sendfile on;
tcp_nopush on;
keepalive_timeout 4;
tcp_nodelay on;
# Hide version information
server_tokens off;
# Include configurations
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
/etc/nginx/conf.d/gzip.conf
gzip on;
# Compression level
gzip_comp_level 6;
# HTTP version
gzip_http_version 1.0;
# File min lenght to compress
gzip_min_length 0;
# Compress all proxied files
gzip_proxied any;
# Mimes to compress
gzip_types text/plain text/css application/x-javascript text/xml \
application/xml application/xml+rss text/javascript;
# Disable for IE 6 and below
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
/etc/nginx/conf.d/cache.conf
# Set locations and sizes
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=nginx_cache:10m max_size=500m;
proxy_temp_path /tmp/nginx;
# Putting the host name in the cache key allows different virtual hosts to share the same cache zone
proxy_cache_key "$scheme://$host$request_uri";
# Cache different return codes for different lengths of time
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
/etc/nginx/conf.d/proxy.conf
proxy_redirect off;
# Set proxy headers
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Client configuration
client_max_body_size 10m;
client_body_buffer_size 128k;
client_header_buffer_size 64k;
# Connection and buffer
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffer_size 16k;
proxy_buffers 32 16k;
proxy_busy_buffers_size 64k;
/etc/nginx/sites-available/default
server {
# Listen on Port 80
listen 80 default;
# Resolve server_name with DNS
server_name _;
server_name_in_redirect off;
resolver 213.133.100.100;
# Strip www from host
if ($host ~* ^www\.(.*)) {
set $cleanhost $1;
}
if ($cleanhost = "") {
set $cleanhost $host;
}
access_log /var/log/ispconfig/httpd/$cleanhost/access.log;
# Serve static files through nginx
#location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|e$
location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|ex$
root /var/www/$cleanhost/web;
access_log off;
expires max;
error_page 404 /;
}
# Apache backend for dynamic files
location / {
root /var/www/$cleanhost/web;
index index.html index.htm index.php;
access_log off;
proxy_cache nginx_cache;
proxy_pass http://$cleanhost:82;
proxy_pass_header Set-Cookie;
}
}
What for?
As you can see, I am trying to serve static files through nginx and compress them. All other requests are passed to apache, and the result get's cached from nginx (within tmpfs).
With this default site, I don't have to create a config for every domain on the server.
Problems
OK, since you've seen the config, let's move over the the problems I got with these configurations:
If a website uses mod_rewrite to rewrite URLS like index.php?page=home to */page/home.html, nginx thinks that this is a static file (because of the .html ending) - and I get an error "not found".
On wordpress blogs, you are not able to insert medias into posts. You can upload them, but as soon as you push the "insert into post" button, you'll get an 403 - forbidden error.
Every website has it's own error documents folder /var/www/domain.tld/web/errors/[404.html|500.html etc.]. How do I tell nginx/apache to serve these and not the nginx/apache's default error pages?
What would help me?
If someone could walk through the configurations and look for parts, which could cause the named errors/problems.
Also, in general, general hints and tipps related to performance/security etc. are appreciated :)
Thank you very much for your time and help!
Regards, MaddinXx