RkBlog

Hardware, programming and astronomy tutorials and reviews.

Przykładowe konfiguracje Nginx

Przegląd konfiguracji serwera Nginx do różnych zadań (load balancing, virtualhost, serwowanie plików statycznych, serwowanie aplikacji PHP)

[toc]

Load Balancing - Rozkład ruchu na kilka serwerów

Używamy modułu upstream by zdefiniować kilka serwerów serwujących naszą stronę. Następnie dla bloku "serwer" przekazujemy połączenia tym serwerom za pomocą
proxy_pass http://NAZWA_LISTY_UPSTREAM
http {
    upstream myproject {
        server 127.0.0.1:8000 weight=3;
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;    
        server 127.0.0.1:8003;
    }

    server {
        listen: 80;
        server_name: www.domain.com;
        location / {
            proxy_pass http://myproject;
        }
    }
}


VirtualHost

Dla różnych katalogów można przypisać domenę za pomocą server_name. Konfiguracja dla poszczególnych serwerów zawiera się w blokach "server". Można też dołączać (include) pliki konfiguracyjne dla poszczególnych virtual hostów. Oto przykład dwóch virtualhostów serwujących pliki statyczne:
http {
    server {
        listen          80;
        server_name     www.domain1.com;
        access_log      logs/domain1.access.log main;

        location / {
            index index.html;
            root  /var/www/domain1.com/htdocs;
        }
    }

    server {
        listen          80;
        server_name     www.domain2.com;
        access_log      logs/domain2.access.log main;

        location / {
            index index.html;
            root  /var/www/domain2.com/htdocs;
        }
    }
}


Serwer dla statycznych plików

Oto pełna konfiguracja dla prostego serwera serwującego statyczną treść:
user  www-data www-data;
worker_processes  2;

error_log  logs/error.log;

pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       conf/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] $status '
                      '"$request" $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay    on;

    server {
        listen       80;

        server_name  moja-domena.com www.inna-domena.com;

        access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}


PHP poprzez FastCGI

Nginx nie uruchamia sam procesów FastCGI i trzeba to zrobić innym programem. By dodać obsługę PHP należy do "location" naszej konfiguracji dodać:
location ~ \.php$ {
   fastcgi_pass   127.0.0.1:12345;
   fastcgi_index  index.php;
 
   fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
   fastcgi_param  QUERY_STRING     $query_string;
   fastcgi_param  REQUEST_METHOD   $request_method;
   fastcgi_param  CONTENT_TYPE     $content_type;
   fastcgi_param  CONTENT_LENGTH   $content_length;
 }

Pełna konfiguracja:
user  www-data www-data;
worker_processes  2;

error_log  logs/error.log debug;

pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       conf/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] $status '
                      '"$request" $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay    on;

    server {
        listen       80;

        server_name  moja-domena.com www.server-name.com;

        access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm index.php;
        }


        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:12345;
            fastcgi_index  index.php;

                        fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;
                    fastcgi_param  QUERY_STRING     $query_string;
                    fastcgi_param  REQUEST_METHOD   $request_method;
                    fastcgi_param  CONTENT_TYPE     $content_type;
                    fastcgi_param  CONTENT_LENGTH   $content_length;

        }

    }
}


DokuWiki pod Nginx

Oto przykład z wiki skryptu wraz z regułami rewrite:
  server {
        listen       80;
        server_name  _ *;
        port_in_redirect off;
        optimize_server_names off;

        access_log  /var/log/nginx/localhost.access.log;

        rewrite ^(/dokuwiki/)_media/(.*) $1lib/exe/fetch.php?media=$2 last;
        rewrite ^(/dokuwiki/)_detail/(.*) $1lib/exe/detail.php?media=$2 last;
        rewrite ^(/dokuwiki/)_export/([^/]+)/(.*) $1doku.php?do=export_$2&id=$3 last;

        location / {
            root   /var/www;
            index  index.html index.htm index.php;
        }

        location /dokuwiki/ {
            if (!-f $request_filename) {
                rewrite ^(/dokuwiki/)(.*)?(.*)  $1doku.php?id=$2&$3 last;
                rewrite ^(/dokuwiki/)$ $1doku.php last;
            }
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /var/www;
        }

        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:8888;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
            include        /etc/nginx/fastcgi_params;
        }
    }


PHP + Drupal + Nginx

Nginx, Fastcgi, PHP, rewrite config for Drupal - Wraz ze skryptem tworzącym procesy FastCGI PHP
Running Drupal with Clean URL on Nginx or Lighttpd


Frameworki Django i Pylons

Pylons
Django
PHP + Ruby on Rails + Django


Inne Przykłady

Using Tracd with Nginx in Cluster Mode
Nginx, my new favorite front end for mongrel cluster
Nginx jako Load Balancer dla kilku Mongreli (RoR)
nginx: the front end solution for rails deployment?
RkBlog

14 July 2008;

Comment article