Веб сервер nginx.

Задание.

Установить nginx на систему с Linux.

Заставить слушать порт

Варианты.

1 8080

2 7777

3 9999

Заставить работать с директорией и отдавать index.html внутри.

Варианты.

1 /www/public_html

2 /home/web

3 /data

Создать виртуальный хост на адрес.

Варианты.

1 sex.local

2 supersite.oh

3 www.www

Запустить из указаной директории (см. выше) стартовый проект Django с использованием uwsgi и проксировать nginx-ом.

Основы работы с Linux. -> Настройка виртуальных хостов nginx.

Настройка виртуальных хостов nginx.

Итак, виртуальный хост — это разделение адресного пространства web-сервера, например, по имени сайта, позволяющее запускать несколько web-сайтов/приложений на одном физическом сервере.

Если говорить в терминологии документации nginx, виртуальный хост также называется «Server Block».

Установка.

sudo apt-get install -y nginx

Запуск, останов, проверка конфигурации

service nginx start|stop
nginx -t

Посмотреть под кем работают вокеры nginx

ps -eo "%U %G %a" | grep nginx

Создание веб-директории и назначение ей прав.

sudo mkdir -p /home/webmaster/www/django

sudo chown -R www-data:www-data /home/webmaster/www/mysite

Вы можете заменить пользователя «www-data», используемого ниже, на другого, но по умолчанию nginx работает от имени именно этого пользователя.

Теперь сделаем так, чтобы все пользователи могли читать наши новые файлы:

sudo chmod 755 /home/webmaster/www

Создаем стартовую страницу /home/webmaster/www/mysite/index.html.

<html>
  <head>
    <title>mysite.ru</title>
  </head>
  <body>
    <h1>Virtual Host в nginx!</h1>
  </body>
</html>

Создание конфигурации виртуального хоста

В nginx в директории /etc/nginx/sites-available есть шаблон для создаваемых конфигураций.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/mysite.ru

Минимальная конфигурация.

server {
    listen   80;
    root /home/webmaster/www/mysite;
    index index.html index.htm;
    server_name mysite.ru www.mysite.ru;
}

В качестве server_name вы также можете задать IP-адрес или несколько имён через пробел, по которым будет доступен хост, как мы и сделали.

Вариант использования listen

listen *:80;

root директива говорит nginx взять url и добавить его к root пути.

В nginx есть папки sites-available и sites-enabled. В первой хранятся конфигурации ВСЕХ виртуальных хостов, которые могут быть на данном сервере, а в директории sites-enabled символические ссылки на активные.

Никто не запрещает в sites-enabled размещать оригинал файла конфигурации, а не ссылку, но это будет менее удобно, т.к. в случае необходимости отключения придётся либо удалять файл (тогда будет проблематично включить обратно), либо перемещать его в другую директорию (тогда мы должны помнить, куда мы перенесли). Гораздо проще грохнуть символическую ссылку!

Создание символической ссылки.

sudo ln -s /etc/nginx/sites-available/mysite.ru /etc/nginx/sites-enabled/mysite.ru

Проверка правильности конфигурации.

sudo nginx -t

Перезапуск сервера.

sudo service nginx restart

Настройки локальных хостов.

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

sudo nano /etc/hosts

Пример конфигурации.

127.0.0.1 starter.php
127.0.0.1 market.local

В блоке server могут быть дополнительные блочные директивы. Например location.

Все директивы, которые используются в блоке server, могут использоваться и в блоках location. Но нам не обязательно указывать root и index в каждом location. Если их опустить, то будут наследоваться те, которые были указаны в родительском блоке.

Пример блока location

server {
    listen *:80;
    server_name example.ru;
    root /usr/share/nginx/html;
    index index.html index.htm;
    location / {}
}

localion можно направить в другую директорию.

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

Если у нас есть каталог /home/zdimon/www/nginx/web2 и мы хотим натравить в него все запросы по адресу

http://v1.nginx.loc/web2/

Пишем такой локейшин

location /web2 {
    root /home/zdimon/www/nginx;
}

Такой пример работать не будет

location /web2 {
    root /home/zdimon/www/nginx/web2;
}

т.к. root будет искать в таком каталоге /home/zdimon/www/nginx/web2/web2

Для того чтобы этого избежать можно применить директиву alias.

alias - говорит nginx что заменить в пути location-а на то, что указано в alias.

Обработка 404 и директива try_files.

try_files $uri $uri/ =404;

Проксирование через порт.

Пример проксирования с порта, на котором висит другой веб сервер.

location / {
    proxy_pass http://localhost:8080;
}

При отсутствии процесса на указанном порту получим.

nginx

Запуск простого сервера на python.

python3 -m http.server 8080

Пример проксирования всеx файлов php

    location ~ \.php$ {
        fastcgi_pass    127.0.0.1:8002;
        include snippets/fastcgi-php.conf;
    }

Пример проксирования статичных файлов.

location ^~ /images {
    alias /var/www/static;
    try_files $uri $uri/ =404;
}

location ^~ /css {
    alias /var/www/static;
    try_files $uri $uri/ =404;
}

Настройка логов.

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

Запуск python uwsgi процесса.

apt-get install uwsgi uwsgi-plugin-python3

Создание настроечного файла.

Запуск процессов из под supervisor.

Установка uwsgi и supervisor.

apt-get install build-essential python3-dev

apt-get install uwsgi supervisor

sudo apt-get install uwsgi-plugin-python3

Настроечный файл /etc/uwsgi/apps-enabled/mysite.ini.

[uwsgi]
socket = /tmp/pl.sock
buffer-size=32768
chmod-socket = 666
processes = 1
threads = 2
virtualenv = /home/zdimon/Desktop/projects/pl/venv/
chdir = /home/zdimon/Desktop/projects/pl/pl
module = pl.wsgi:application
plugins = python3

Проксирование с unix сокета.

location / {
    proxy_pass  http://unix:/tmp/pl.sock;
}