Главная
Главная Руководства FreeBSD › FreeBSD - устанавливаем и настраиваем nginx



Автор:

Статья опубликована: 2015-04-03 09:11:02
Последние правки: 2015-06-01 13:50:48

Похоже, что эра Apache в мире web-серверов проходит и наступает эра nginx. Я расскажу вам как установить nginx, настроить geoip и запустить сайт. В качестве примера приведены две конфигурации, "свой сайт" и "прокси".

  • Исходные данные
    # uname -sr
    FreeBSD 10.0-RELEASE-p18
    # pkg info | grep nginx
    nginx-1.6.2_1,2                Robust and small WWW server
    

  • Установка
    # cd /usr/ports/www/nginx
    # nake install clean
    
    В настройках выбираем:
    [ ] DEBUG                 Build with debugging support
    [ ] DEBUGLOG              Enable debug log (--with-debug)
    [x] FILE_AIO              Enable file aio
    [x] IPV6                  IPv6 protocol support
    [ ] GOOGLE_PERFTOOLS      Enable google perftools module
    [x] HTTP                  Enable HTTP module
    [ ] HTTP_ADDITION         Enable http_addition module
    [x] HTTP_CACHE            Enable http_cache module
    [ ] HTTP_DAV              Enable http_webdav module
    [ ] HTTP_FLV              Enable http_flv module
    [x] HTTP_GEOIP            Enable http_geoip module
    [x] HTTP_GZIP_STATIC      Enable http_gzip_static module
    [ ] HTTP_GUNZIP_FILTER    Enable http_gunzip_filter module
    [ ] HTTP_IMAGE_FILTER     Enable http_image_filter module
    [ ] HTTP_PERL             Enable http_perl module
    [ ] HTTP_RANDOM_INDEX     Enable http_random_index module
    [ ] HTTP_REALIP           Enable http_realip module
    [x] HTTP_REWRITE          Enable http_rewrite module
    [ ] HTTP_SECURE_LINK      Enable http_secure_link module
    [x] HTTP_SSL              Enable http_ssl module
    [x] HTTP_STATUS           Enable http_stub_status module
    [ ] HTTP_SUB              Enable http_sub module
    [ ] HTTP_XSLT             Enable http_xslt module
    [ ] MAIL                  Enable IMAP4/POP3/SMTP proxy module
    [ ] MAIL_IMAP             Enable IMAP4 proxy module
    [ ] MAIL_POP3             Enable POP3 proxy module
    [ ] MAIL_SMTP             Enable SMTP proxy module
    [ ] MAIL_SSL              Enable mail_ssl module
    [ ] SPDY                  Enable SPDY protocol support (SSL req.)
    [ ] WWW                   Enable html sample files
    [ ] CACHE_PURGE           3rd party cache_purge module
    [ ] CTPP2                 3rd party CT++ module
    [ ] ECHO                  3rd party echo module
    [x] HEADERS_MORE          3rd party headers_more module
    [ ] HTTP_ACCEPT_LANGUAGE  3rd party accept_language module
    [ ] HTTP_ACCESSKEY        3rd party http_accesskey module
    [ ] HTTP_AUTH_DIGEST      3rd party http_authdigest module
    [ ] HTTP_AUTH_LDAP        3rd party http_auth_ldap module
    [ ] HTTP_AUTH_PAM         3rd party http_auth_pam module
    [ ] HTTP_AUTH_REQ         3rd party http_auth_request module
    [ ] HTTP_DAV_EXT          3rd party webdav_ext module
    [ ] HTTP_EVAL             3rd party eval module
    [ ] HTTP_FANCYINDEX       3rd party http_fancyindex module
    [ ] HTTP_FOOTER           3rd party http_footer module
    [ ] HTTP_MOGILEFS         3rd party mogilefs module
    [ ] HTTP_NOTICE           3rd party notice module
    [ ] HTTP_PUSH             3rd party push module
    [ ] HTTP_PUSH_STREAM      3rd party push stream module
    [ ] HTTP_REDIS            3rd party http_redis module
    [ ] HTTP_RESPONSE         3rd party http_response module
    [ ] HTTP_SUBS_FILTER      3rd party subs filter module
    [ ] HTTP_UPLOAD           3rd party upload module
    [ ] HTTP_UPLOAD_PROGRESS  3rd party uploadprogress module
    [ ] HTTP_UPSTREAM_FAIR    3rd party upstream fair module
    [ ] HTTP_UPSTREAM_HASH    3rd party upstream hash module
    [ ] HTTP_UPSTREAM_STICKY  3rd party upstream sticky module
    [ ] HTTP_ZIP              3rd party http_zip module
    [ ] ARRAYVAR              3rd party array_var module
    [ ] DRIZZLE               3rd party drizzlie module
    [ ] ENCRYPTSESSION        3rd party encrypted_session module
    [ ] FORMINPUT             3rd party form_input module
    [ ] GRIDFS                3rd party gridfs module
    [ ] ICONV                 3rd party iconv module
    [ ] LET                   3rd party let module
    [ ] LUA                   3rd party lua module
    [ ] MEMC                  3rd party memc (memcached) module
    [ ] MODSECURITY           3rd party mod_security module
    [ ] NAXSI                 3rd party naxsi module
    [ ] PASSENGER             3rd party passenger module
    [ ] POSTGRES              3rd party postgresql module
    [ ] RDS_CSV               3rd party rds_csv module
    [ ] RDS_JSON              3rd party rds_json module
    [ ] REDIS2                3rd party redis2 module
    [ ] RTMP                  3rd party rtmp module
    [ ] SET_MISC              3rd party set_misc module
    [ ] SFLOW                 3rd party sflow module
    [ ] SLOWFS_CACHE          3rd party slowfs_cache module
    [ ] SRCACHE               3rd party srcache module
    [ ] SUPERVISORD           3rd party supervisord module
    [ ] SYSLOG_SUPPORT        3rd party syslog support
    [ ] TCP_PROXY             3rd party tcp_proxy module
    [ ] UDPLOG                3rd party udplog (syslog) module
    [ ] XRID_HEADER           3rd party x-rid header module
    [ ] XSS                   3rd party xss module
    [ ] VIDEO                 Video module support
    ─────────────────────────── Video module support ─────────────────────────
    ( ) HTTP_MP4              Enable http_mp4 module
    ( ) HTTP_MP4_H264         3rd party mp4/h264 module
    

  • /etc/rc.conf
    nginx_enable="YES"
    

  • Настройка
    Конфигурационные файлы хранятся в /usr/local/etc/nginx
    Основная настройка: /usr/local/etc/nginx/nginx.conf. Пишем с нуля:
    # запускаем пять процессов
    worker_processes  5;
    
    error_log  /var/log/nginx/error.log;
    
    events {
        worker_connections  1024;
        use kqueue;
    }
    
    http {
        server_tokens off;
        include       mime.types;
        default_type  application/octet-stream;
    
        sendfile        on;
    
        keepalive_timeout  30;
        reset_timedout_connection on;
        client_body_timeout 10;
        send_timeout 2;
    
        gzip  on;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
    
        include /usr/local/etc/nginx/sites/*.conf;
    }
    
    Замечания по конфигурации:

    • Максимальное количество соединений, которые nginx может обслуживать одновременно определяются произведением двух параметров: worker_processes (в последних версиях nginx рекомендуется задавать значение auto) и worker_connections (значения от 1024 до 4096);
    • use kqueue; - метод выбора соединений (epoll,kqueue). Для FreeBSD самый быстрый - kqueue;
    • server_tokens off; - не показываем ничего в подписи
    • sendfile on; - метод отправки данных (наиболее эффективный)
    • keepalive_timeout 30; - nginx будет ждать 30 секунд перед закрытием keepalive соединения
    • reset_timedout_connection on; - сбрасывать соединение с клиентом, который не отвечает;
    • client_body_timeout 10; - ждать 10 секунд тело запроса от клиента, после чего сбросить соединение;
    • send_timeout 2; - сбросить соединение если клиент прекратил чтение ответа в течение 2 секунд;
    • gzip - сжимаем данные при передаче клиенту;
    • include ... - включаем в общую конфигурацию конфиги отдельных сайтов;


  • Конфигурация сайта, который обслуживает сам nginx. /usr/local/etc/nginx/sites/mysite.conf
    server {
        listen 192.168.1.3:80 default sndbuf=16k rcvbuf=8k accept_filter=httpready;
        server_name mysite.ru www.mysite.ru;
    
        access_log /var/log/nginx/mysite-access;
        error_log /var/log/nginx/mysite-error;
    
        root /home/mysite/htdocs;
    
        location / {
            index index.html index.html;
        }
    
        location ~ \.html {
            ssi on;
            ssi_silent_errors on;
        }
    
        location ~* [^.]\.(gif|jpe?g|png|bmp|ico|swf|wav|mp3|m3u|txt|rar|zip) {
            expires 1M;
            add_header cache-control public;
        }
    
        location ~ /cgi-bin/ {
            access_log /var/log/nginx/mysite-access.pl.log;
            error_log /var/log/nginx/mysite-error.pl.log debug;
    
            gzip off;
            include /usr/local/etc/nginx/fastcgi_params;
            fastcgi_pass 127.0.0.1:8999;
            fastcgi_index index.pl;
            fastcgi_param SCRIPT_FILENAME /home/mysite/$fastcgi_script_name;
        }
    
        location ~ /\.ht {
            deny all;
        }
    }
    
    Подробно о конфигурации:

    • listen 192.168.1.3:80 default sndbuf=16k rcvbuf=8k accept_filter=httpready; - слушаем на ip=192.168.1.3, порт 80. default - сайт по умолчанию (например, показывается если клиент ломится по ip а не по имени сайта), можно указать только для одного сайта (в одном блоке server{}). sndbuf rcvbuf - буферы в памяти на отправку и получение;
    • accept_filter=httpready - технология "accept filters" существует только в FreeBSD и позволяет передавать пакет от ядра к процессу только в случае прихода каких либо данных или валидного http запроса, что помогает разгрузить сервер в случае большого количества соединений. Чтобы её включить, необходимо прописать в /boot/loader.conf загрузку модулей ядра accf_http accf_data, а лучше пересобрать ядро с опциями:
      options ACCEPT_FILTER_HTTP
      options ACCEPT_FILTER_DATA
      
    • root - корневая директория сайта;
    • location / - в этом блоке указываем индексные файлы;
    • location ~ \.html - в этом блоке указываем что файлы с расширением .html обрабатываются при помощи ssi;
    • location ~ /cgi-bin/ - в cgi-bin у нас хранятся скрипты на perl, запускаем их через fastcgi-сервер. access_log и error_log в этом блоке добавлены для складывания обращений к скриптам в отдельные лог-файлы, эти строчки можно убрать и все будет писаться в общий лог;


  • Конфигурация сайта-прокси. Сам сайт обслуживается другим web-сервером. /usr/local/etc/nginx/sites/proxysite.conf
    server {
        listen 0.0.0.0:80;
        server_name shs.home;
        location / {
            proxy_pass http://192.168.1.4:80;
            include proxy_vars.conf;
        }
    }
    
    Подробно о конфигурации:

    • listen 0.0.0.0:80; - слушаем на всех ip-адресах
    • include proxy_vars.conf; - вставляем файл с дополнительными заголовками.
      /usr/local/etc/nginx/proxy_vars.conf
      proxy_set_header        X-Forwarded-For         $remote_addr;
      proxy_set_header        X-Real-IP               $remote_addr;
      proxy_set_header        Host                    $host;