Debian Jessie: Установка и настройка Nginx

Это статья из цикла стетей моего небольшого HowTo по Debian Jessie.

Тут мы коротко рассмотрим установку и базовую настройку популярного веб сервера nginx, подготовим его для будущего использования по прямому назначению.

Для начала установим nginx (используются стандартные репы Debian Jessie):

gw:~$ sudo apt-get install nginx-extras

И поехали …

Почемуто для microcache не создается директория при инстале пакета, а неплохо бы … Но мы не гордые — можем и ручками создать:

gw:~$ sudo mkdir -p /var/cache/nginx/microcache
gw:~$ sudo chown -R www-data.www-data /var/cache/nginx

Для конфигов будущих сайтов по аналогии с apache создаем две директории sites-available и sites-enabled:

gw:~$ sudo mkdir /etc/nginx/sites-{available,enabled}

Для различных стандартных настроек создаем отдельную директорию includes:

gw:~$ sudo mkdir /etc/nginx/includes

Поместим туда первый небольшой полезный инклуд который будем использовать в будущем много где:

gw:~$ sudo vim /etc/nginx/includes/disable_some_static_logs.conf

В файлик помещаем следующие опции которые выключают логирование доступа к перечисленным файлам:

location = /apple-touch-icon-precomposed.png {
   log_not_found off;
   access_log off;
}

location = /apple-touch-icon.png {
   log_not_found off;
   access_log off;
}

location = /favicon.ico {
   log_not_found off;
   access_log off;
}

location = /robots.txt {
   log_not_found off;
   access_log off;
}

Перед редактированием основного конфига хочу напомнить что сервер у меня слабенький (Intel Atom), посещаемость общая по всем сайтам сервера — около 1000 хостов/сутки. Поэтому и настройки nginx весьма скромные. Основной конфиг /etc/nginx/nginx.conf у меня вышел такой:

user www-data;
worker_processes 1;
pid /run/nginx.pid;

events {
        worker_connections 2048;
        multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        log_format bots '[$time_local] - $remote_addr - $remote_user '
            '"$request" $status $bytes_sent '
            '"$http_referer" "$http_user_agent" "$gzip_ratio"';

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        gzip_vary on;
        gzip_proxied any;
        gzip_min_length 1024;
        gzip_comp_level 3;
        gzip_buffers 16 8k;
        gzip_http_version 1.1;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

Хорошим делом будет перво-наперво в nginx настроить дефолтный виртуальный хост сервера. Что это такое? Это заглушка куда попадают все запросы которые не совпали с явными виртуалхостами вашего сервера. Такой звпрос получается если в браузере ввести не имя реального сайта, например, а ip-шник вашего сервера. Запрос всеравно попадет на 80-й порт сервера, а значит должен быть обработан WEB-сервером. Но тут резонно спросить — а кто вообще ходит на сайты по IP? Нетрудно догадаться кто 🙂 Различные боты, сканеры сети и прочий мусор обильно болтающийся по Интернету в поисках сайтов-заваляшек в которые можно просочиться используя всем давно известные эксплойты. И что должен ответить WEB-сервер на подобный запрос? В моем понимании выдать какуюто из стандартных заглушек, например приславутое апачевское «It Works» или в нашем случае nginx-овское «Welcome to Nginx».
Я решил использовать свою заглушку, для этого создал отдельную директорию:

gw:~$ sudo mkdir /var/www/default

И поместил туда файлик index.html с вот таким содержанием:

<html>
 <body>
  <h1>It works!</h1>
 </body>
</html>

Теперь нужно в nginx настроить выдачу дефолтной странички всем желающим. Для этого сооружаем дефолтный конфиг /etc/nginx/sites-enabled/default в котором я также для потехи ограничил скорость скачивания до 32 байта в секунду.
Открываем текстовым редактором:

gw:~$ sudo vim /etc/nginx/sites-available/default

И помещаем туда следующее:

##
# Default server configuration
##
server {
    listen 80 default_server;
    #listen [::]:80 default_server;

    # SSL configuration
    #
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
    #
    # Self signed certs generated by the ssl-cert package
    # Don't use them in a production server!
    #
    # include snippets/snakeoil.conf;

    root /var/www/default;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    server_name _;

    # BW Limit to 32 B/s
        limit_rate 32;

    # Some Includes
    include includes/disable_some_static_logs.conf;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #   include snippets/fastcgi-php.conf;
    #
    #   # With php5-cgi alone:
    #   fastcgi_pass 127.0.0.1:9000;
    #   # With php5-fpm:
    #   fastcgi_pass unix:/var/run/php5-fpm.sock;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #   deny all;
    #}
}

Теперь включим данный конфиг, для этого нам нужно создать символическую ссылку на конфиг в таком виде: /etc/nginx/sites-enabled/default -> /etc/nginx/sites-available/default
Для создания такой ссылки я обычно сначала перехожу в директорию /etc/nginx/sites-enabled

gw:~$ cd /etc/nginx/sites-enabled

После чего собственно создаю ссылку:

gw:/etc/nginx/sites-enabled$ sudo ln -s ../sites-available/default

Смотрим что получилось:

gw:/etc/nginx/sites-enabled$ ls -l
total 0
lrwxrwxrwx 1 root root 34 Apr 24  2015 default -> ../sites-available/default
gw:/etc/nginx/sites-enabled$

Отлично, ссылка есть и она ведет на нужный конфиг. Проверяем конфигурацию nginx:

gw:/etc/nginx/sites-enabled$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
gw:/etc/nginx/sites-enabled$

Как видим с конфигурацией все отлично, перезапускаем nginx:

gw:/etc/nginx/sites-enabled$ sudo systemctl restart nginx

И не забываем добавить nginx в автозагрузку:

gw:/etc/nginx/sites-enabled$ sudo systemctl enable nginx

После чего пробуем в браузере зайти на сервер по ip-адресу или с консоли curl-ом можно проверить:

gw:~$ curl localhost
<html>
 <body>
  <h1>It works!</h1>
 </body>
</html>
gw:~$

Ну вот, простейшая конфигурация nginx готова принимать на борт сайты. Дальше кратенько опишем настройку PHP-FPM и потом сделаем общий обзор настройки WEB сервера под любую из схем работы: nginx + apache2 + mod_php5, nginx + php-fpm

Хай щастить!

  1. Комментов пока нет

  1. Трэкбэков пока нет.

Why ask?