Метка: nginx

  • WordPress + nginx + cache (Настройка nginx + кэширование + WP)

    У nginx с версии 0.7(чёта-там) появилась функция кэширования ответов от бэкэнда.
    штука крайне полезная, в условиях высоких нагрузок, но настроить на корректную работу для WP оказалось не так просто.

    Но попробуем
    Создаём каталог где будет храниться кэш, назначаем права работы с ним (у меня nginx работает под www-data)

    mkdir /var/cache/nginx
    chown www-data:www-data /var/cache/nginx/Code language: Bash (bash)

    в файле nginx.conf
    пишем

    ## Создаем кеш зону pagecache (память под ключи в 16Мб) с настройками:
    # inactive: xранить кеш 1 день (если к нему не было обращений)
    # max_size: максимальный размер кеш данные 256Мб
    proxy_cache_path /var/cache/nginx levels=2 keys_zone=pagecache:16m inactive=1d max_size=256m;Code language: Bash (bash)

    теперь для нужного нам Виртуал хоста в диррективе SERVER прописываем, привожу полный конфиг своего vhost

    server {
    listen 80;
    server_name www.krasfun.ru krasfun.ru krasfan.ru www.krasfan.ru;
    
    #access_log /var/log/nginx/krasfun/access2.log;
    access_log off;
    error_log  /var/log/nginx/krasfun/error3.log  error;
    
    
    #client_max_body_size 300m
    # Сетевое ускорение
    tcp_nopush on;
    tcp_nodelay on;
    
    #30 одновременных коннектов
    #limit_conn one 30;
    
    index index.php;
    
    if ($http_cookie ~* «comment_author_|wordpress_(?!test_cookie)|wp-postpass_» ) {
    set $do_not_cache 1;
    }
    
    root  /var/www/krasfun;
    
    fastcgi_cache_bypass $do_not_cache;
    fastcgi_no_cache $do_not_cache;
    fastcgi_pass_header Cookie;
    fastcgi_cache pagecache;
    fastcgi_cache_key $request_method|$host|$request_uri;
    fastcgi_cache_valid 301 8h;
    fastcgi_cache_valid 404 1h;
    fastcgi_cache_valid 200 15m;
    
    set $Mybackend unix:/tmp/php5-fpm.sock;
    
    location / {
    try_files $uri $uri/ @wordpress;
    }
    # Это чтоб Админка, логинизация, и регистрация не кэшировались
    location ~ ^/(wp-admin/.*\.php|wp-login\.php|wp-register\.php|(feed|comment/feed)(/.*)?)$ {
    try_files $uri @wordpress;
    set $do_not_cache 1;
    fastcgi_cache_bypass 1;
    fastcgi_no_cache 1;
    fastcgi_pass $Mybackend;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_index index.php;
    include /etc/nginx/fastcgi_params;
    }
    
    location ~ \.php$ {
    try_files $uri @wordpress;
    include /etc/nginx/fastcgi_params;
    fastcgi_pass $Mybackend;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    if ($do_not_cache != «1″) {
    add_header Vary Cookie;
    }
    }
    
    location @wordpress {
    fastcgi_pass $Mybackend;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    include /etc/nginx/fastcgi_params;
    fastcgi_cache pagecache;
    fastcgi_param SCRIPT_NAME /index.php;
    if ($do_not_cache != "1") {
    add_header Vary Cookie;
    }
    }
    
    #Static files location
    location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|html|flv|mp3)$ {
    root /var/www/krasfun; }
    
    }Code language: Bash (bash)

    проверяем nginx -t и перезапускам nginx

    тыкаем по сайту и потом смотри что у нас появилось в /var/cache/nginx

    Прирост производительности? да конечно же есть.

    тест номер1

    # ab -n 1000 -c 5 http://www.krasfun.ru/
    This is ApacheBench, Version 2.3 <$Revision: 655654 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking www.krasfun.ru (be patient)
    Completed 100 requests
    Completed 200 requests
    Completed 300 requests
    Completed 400 requests
    Completed 500 requests
    Completed 600 requests
    Completed 700 requests
    Completed 800 requests
    Completed 900 requests
    Completed 1000 requests
    Finished 1000 requests
    
    
    Server Software:        nginx/0.8.53
    Server Hostname:        www.krasfun.ru
    Server Port:            80
    
    Document Path:          /
    Document Length:        37725 bytes
    
    Concurrency Level:      5
    Time taken for tests:   3.577 seconds
    Complete requests:      1000
    Failed requests:        0
    Write errors:           0
    Total transferred:      37972000 bytes
    HTML transferred:       37725000 bytes
    Requests per second:    279.54 [#/sec] (mean)
    Time per request:       17.887 [ms] (mean)
    Time per request:       3.577 [ms] (mean, across all concurrent requests)
    Transfer rate:          10365.83 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    2   1.0      2       6
    Processing:     7   16  46.0     14    1038
    Waiting:        1    3   2.1      2      26
    Total:          9   18  45.9     17    1039
    
    Percentage of the requests served within a certain time (ms)
      50%     17
      66%     17
      75%     18
      80%     18
      90%     19
      95%     21
      98%     28
      99%     31
     100%   1039 (longest request)Code language: Bash (bash)

    Без кэширования этот тест провалился куда-то

  • Запускаем django на nginx

    Давным давно, я писал как установить nginx

    там же в комментариях подсказали ещё способ

    nginx=stable # use nginx=development for latest development version
    add-apt-repository ppa:nginx/$nginx
    apt-get update
    apt-get install nginxCode language: Bash (bash)

    получаем последний nginx.

    Напомню, что у меня за nginx стоят разные «бэк-энды»
    для самого нагруженного сайта я использую php5-fpm
    для остальных сайтов я использую apache2
    для Django проектов я использовал Apache2 + mod_python но его прожорливость, давала повод задуматься.

    в итоге я искал способ освободить ресурсы занимаемые Индейцем.

    Такой способ нашёлся 🙂

    создаю конфигурационный файл хоста nginx.

    touch djangositeCode language: Bash (bash)

    у меня они лежат в /etc/nginx/sites-available и уже от туда симлинками идут в /etc/nginx/sites-enabled

    Конфигурационный файл такого содержания

    server {
    listen 80;
    server_name sitename.ru www.sitename.ru;
    
    charset utf-8;
    
    access_log /var/log/nginx/sitename-access.log;
    error_log /var/log/nginx/sitename-error.log;
    client_max_body_size 300m;
    
    # Это, чтоб стили и статические файлы админки подгружались, проверьте у себя,
    # в разных версиях Ubuntu могут быть разные версии Питона.
    # ну и в настройках джанго проекта разумеется у нас тоже указан ADMIN_MEDIA как media_admin
    
    location /media_admin {
        alias  /usr/lib/python2.5/site-packages/django/contrib/admin/media;
        }
    location / {
    #Это как пример как мы запускаем джангоСервер
    #python ./manage.py runfcgi method=prefork socket=/tmp/sitemane.sock pidfile=/tmp/sitename.pid
    # Общаться будем по сокету, хотя можно и по 127.0.0.1:8000
    fastcgi_pass   unix:/tmp/sitename.sock;
    #Ага и вот этот файлик не забудем создать, о нём ниже
    include fastcgi_params_django;
    }
    
    #error_page 404 /404.html;
    
    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
    }Code language: Bash (bash)

    так же создаём файл

    touch /etc/nginx/fastcgi_params_djangoCode language: Bash (bash)

    и в него вкладываем вот такие параметры

    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_pass_header Authorization;
    fastcgi_intercept_errors off;
    
    fastcgi_param GATEWAY_INTERFACE CGI/1.1;
    fastcgi_param SERVER_SOFTWARE nginx;
    
    fastcgi_param REMOTE_ADDR $remote_addr;
    fastcgi_param REMOTE_PORT $remote_port;
    fastcgi_param SERVER_ADDR $server_addr;
    fastcgi_param SERVER_PORT $server_port;
    fastcgi_param SERVER_NAME $server_name;
    fastcgi_param SERVER_PROTOCOL $server_protocol;
    
    # PHP only, required if PHP was built with --enable-force-cgi-redirect
    fastcgi_param REDIRECT_STATUS 200;Code language: Bash (bash)

    проверяем верность конфигурации

    nginx -tCode language: Bash (bash)

    если всё ОК идём дальше.

    проекты джанго у меня лежат в /home/django

    Заходим в нужный нам проект и создадим там скрипт сервера.

    touch server.shCode language: Bash (bash)

    Вот с таким содержанием

    #!/bin/bash
    
    
    case "$1" in
    "start")
    #есть 2 варианта запуска сервера, по сети и через unix сокеты
    # последний выигрывает по производительности
    #python ./manage.py runfcgi method=prefork host=127.0.0.1 port=8000 pidfile=/tmp/sitename.pid
    python ./manage.py runfcgi method=prefork socket=/tmp/sitename.sock pidfile=/tmp/sitename.pid
    # не забываем, про то, что сокет у нас мог прочитать фронт-энд
    # а nginx  у меня работает с правами www-data
    chown www-data:www-data /tmp/sitename.sock
    ;;
    "stop")
    kill -9 `cat /tmp/sitemane.pid`
    ;;
    "restart")
    $0 stop
    sleep 1
    $0 start
    ;;
    *) echo "Usage: ./server.sh {start|stop|restart}";;
    esacCode language: Bash (bash)

    Вот и весь скрипт, не забываем только поменять sitename на имя вашего сайта, а то получится, что на один pid или сокет у вас будет ссылаться несколько серверов.

    чтоб запустить сервер

    ./server.sh startCode language: Bash (bash)

    А вот он и не запустился ругается на Flup

    No module named flupCode language: Bash (bash)

    нам понадобится пакет flup это питоновский пакет, поэтому его я устанавливаю вот так

    easy_install flupCode language: Bash (bash)

    Можно попробовать поставить его из репозитория убунты

    apt-get install python-flupCode language: Bash (bash)

    Но я так не пробовал 😉

    Всё сервер запустился, можно перезапустить nginx для применения новой конфигурации

    /etc/init.d/nginx restartCode language: Bash (bash)

    Всё готово, наш сервер запустился.

    Теперь по хорошему добавить скрипт запуска сервера в автозагрузку.

  • Дружим nginx + ssl

    Понадобилось к одному из сайтов прикрутить ssl
    Напомню, что nginx у меня выступает как фронт-энд к Apache2
    чтоб в дальнейшем было меньше проблем, при отказе от apache2 доверим шифрование nginx

    Для этого создаём конфигурационный файл

    touch /etc/nginx/ssl.confCode language: Bash (bash)

    Добавляем в него содержимое

    # Подключение самоподписанного сертификата
    # генерация сертификата:
    # openssl req -new -x509 -days 9999 -nodes -out cert.pem -keyout cert.key
    
    ssl			on;
    ssl_protocols		SSLv3 TLSv1;
    ssl_certificate		/etc/nginx/ssl/cert.pem;
    ssl_certificate_key	/etc/nginx/ssl/cert.key;Code language: Bash (bash)

    Создадим папку где будем хранить сертификаты:

    mkdir /etc/nginx/sslCode language: Bash (bash)

    Для большей безопасности ограничиваем доступ к сертификатам:

    chown www-data:www-data /etc/nginx/ssl
    chmod 700 /etc/nginx/sslCode language: Bash (bash)

    Перейдем в эту папку и с генерируем сертификат:

    cd /etc/nginx/ssl
    openssl req -new -x509 -days 9999 -nodes -out cert.pem -keyout cert.keyCode language: Bash (bash)

    При генерации вас попросят указать некоторые данные, заполнять не обязательно но желательно.

    Теперь добавим в конфигурацию Виртального хоста в секцию server

            listen          443;       # порт https
            include	/etc/nginx/ssl.conf; # подключение конфигурации sslCode language: Bash (bash)

    Дальше для примера привожу итоговый вариант файла конфигурации.

    server {
    listen 80;
    listen 443;
    server_name domen.ru www.domen.ru;
    include /etc/nginx/ssl.conf; # подключение конфигурации ssl
    
    access_log /var/log/nginx/domen.ru/access.log;
    
    location / {
    proxy_pass http://127.0.0.1:8086/;
    proxy_redirect off;
    proxy_set_header Host $host;
    .............
    ............
    ..........Code language: Bash (bash)

    проверяем

    nginx -tCode language: Bash (bash)

    Если всё Ok то перезапускаем nginx и радуемся

  • Переезжаем на php5+fpm

    И так, раз выдались выходные, можно поработать для себя и для души, проблема с высокой нагрузкой на мой сервер висит давно надо мною.

    Сегодня решил один из своих сайтов перевести со связки nginx — Apache2+mod_php5 на nginx+php5-fpm в надежде, что появятся свободные ресурсы, которые сервер сможет тратить на mysql.

    Введя в гугл запрос «ubuntu nginx php-fpm» я начал понимать, что предложенные варианты мне не подходят, т.к. я хотел перевести всего один из пару десятков сайтов, а все остальные продолжали работать на apache2.

    Второе условие, что сайт у меня на wordpress и он должен заработать с прежним функционалом.

    Я уже ранее писал, что я перешёл на PHP5.3 и вот ещё боялся ставить php-fpm версий меньше чем 5.3 т.к. не знал, а всё ли заработает, но сильно не задумываясь я решил проверить есть ли php-fpm в репозиториях? ну и разумеет оказался, как раз в тех, откуда я ставил PHP 5.3

    и так поехали

    apt-get install php-fpmCode language: Bash (bash)

    Он успешно устанавливается, связка nginx+apache2 у меня была настроена по вот этим статьям
    Раз — компилируем сам nginx и два связываем всё во едино (пропуская установку из пакета)

    Теперь я хочу один из virtualhost’ов заменить.
    Делаю резервную копию старого конфига и начинаю собирать новый.
    Времени я потратил много.
    Основная беда была в том, что повсеместно используется mod_rewrite для Apache, и теперь надо заставить работать правила но уже на nginx. Снова гугл и снова по крупицам воссоздал конфиг, который работает для wordpress
    и так привожу конфиг
    /etc/nginx/sites-available/mysite

    server {
    listen 80;
    server_name www.mysite.ru mysite.ru;
    
    access_log /var/log/nginx/mysite/access1.log;
    error_log  /var/log/nginx/mysite/error1.log  error;
    
    index index.php;
    root  /var/www/mysite;
    location / {
    try_files $uri $uri/ @wordpress;
    }
    
    location @wordpress {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    include /etc/nginx/fastcgi_params;
    fastcgi_param SCRIPT_NAME /index.php;
    }
    
    location ~ \.php$ {
    try_files $uri @wordpress;
    fastcgi_index index.php;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include /etc/nginx/fastcgi_params;
    }
    
    }Code language: Bash (bash)

    Сохраняем, проверяем nginx на ошибки синтаксиса.

    nginx -tCode language: Bash (bash)

    Если скажет, что ошибок нет, идём дальше — запускаем php5-fpm

     /etc/init.d/php5-fpm startCode language: Bash (bash)

    Теперь можно перезапустить nginx и пробовать зайти на свой сайт.
    я столкнулся с ошибками, пол шаблона wordpress была свёрстана с вот такими тегами
    Когда должно быть
    Поправил нужные места, потом пошёл отредактировал новый php.ini который находится вот тут

    /etc/php5/fpmCode language: Bash (bash)

    Собственно вся история, легче или сложнее жить я пока не заметил надо наблюдать, смотреть на графики и т.п.
    итог wordpress заработал на php-fpm ^)

    Ах чуть не забыл есть ещё плагин для wordpress, который дружит его с nginx
    _http://wordpress.org/extend/plugins/nginx-compatibility/
    я им воспользовался, но не знаю нужен он был или нет

  • nginx на ubuntu — это просто ( Компиляция )

    1. ставим зависимости nginx

    sudo aptitude install libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-devCode language: Bash (bash)

    2. Создаём каталог. заходим в него, качаем свежий nginx

    wget http://sysoev.ru/nginx/nginx-0.7.62.tar.gzCode language: Bash (bash)

    3. Извлекаем

    tar -zxvf nginx-0.7.62.tar.gzCode language: Bash (bash)

    4. Заходим в каталог.

    cd nginx-0.7.62Code language: Bash (bash)

    5. Компиляция. вполне стандартные опции, что первые выдал гугл.

    ./configure --sbin-path=/usr/local/sbin --with-http_ssl_moduleCode language: Bash (bash)

    в результате выполнения команды скрипт configure нам подсказывает, что и как будет

    Configuration summary
    + using system PCRE library
    + using system OpenSSL library
    + md5: using OpenSSL library
    + sha1 library is not used
    + using system zlib libraryCode language: Bash (bash)
    nginx path prefix: "/usr/local/nginx"
    nginx binary file: "/usr/local/sbin"
    nginx configuration prefix: "/usr/local/nginx/conf"
    nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
    nginx pid file: "/usr/local/nginx/logs/nginx.pid"
    nginx error log file: "/usr/local/nginx/logs/error.log"
    nginx http access log file: "/usr/local/nginx/logs/access.log"
    nginx http client request body temporary files: "client_body_temp"
    nginx http proxy temporary files: "proxy_temp"
    nginx http fastcgi temporary files: "fastcgi_temp"Code language: Bash (bash)

    Где будут находится конфиги, где логи т. п.

    далее

    make && make installCode language: Bash (bash)

    Вот и всё nginx готов к работе.
    Можно его запустить командой

    sudo /usr/local/sbin/nginxCode language: Bash (bash)

    Если мы хотим чтобы он запустился с вашими уже рабочими конфигурационными файлами. то создаём символическую ссылку предварительно удалив /usr/local/nginx/conf

    ln -s /etc/nginx /usr/local/nginx/confCode language: Bash (bash)

    6. Правка скрипта запуска.
    т.к. до этого у меня стоял пакет из репозитория, остались и рабочие файлы конфигурации и скрипт управления nginx (/etc/init.d/nginx)
    скорректируем его с учётом нового места установки nginx

    DAEMON=/usr/local/sbin/nginxCode language: Bash (bash)

    7. если до этого был установлен Nginx из пакета. то можно его удалить.

    apt-get remove nginxCode language: Bash (bash)

    8. запускаем

    /etc/init.d/nginx startCode language: Bash (bash)

    9. Проверяем работу сайта.

    Оказалось вот на столько просто 🙂

    PS Данный топик был отправлен мною в песочницу Хабра.