nginx & apache

Description: Новости науки и техники. Всё то, о чём раньше Вы могли только мечтать. Магия современности.

dyvniy M
Topic author, Администратор
Администратор
Avatar
dyvniy M
Topic author, Администратор
Администратор
Age: 36
Reputation: 1
Loyalty: 1
Posts: 3159
Joined: Wed, 10 Oct 2012
With us: 6 years 9 months
Профессия: Программист
Location: Россия, Москва
ICQ Website Skype VK

#1by dyvniy » Fri, 20 Oct 2017, 11:59:17

Единые настройки для кучи сайтов.
https://habrahabr.ru/post/142648/
Spoiler
Один конфиг Nginx для работы с кучей разных сайтов
Nginx
Если вам приходилось настраивать Nginx под нужды веб-студии, сеошников или киберсквоттеров ;), то уже наверняка знаете про символ подчёркивания в качестве server_name. Тем не менее несколько других небесполезных приёмчиков из моего примера почерпнуть можно.

Чтоб создать новый сайт на сервере с такой конфигурацией, достаточно создать директорию с именем сайта и залить в неё содержимое. А конфигурационный файл остаётся единственным и неизменным.

Конфиг делает следующее:
1. Отрезает «www» от адреса, дабы сервер нашел директорию с сайтом невзирая на эти буквы в URL.
2. Выдаёт отдельную страничку при запросе несуществующего сайта.
3. Делает стандартный редирект на index.php в корне сайта при запросе несуществующего пути.
4. Перенаправляет запрос на php-fpm при вызове .php файлов.
5. Добавляет возможность обработки .htm(l) файлов как PHP.



Директории для сайтов создаются в /var/www/all/.
Симлинки с www на без www не требуются.
В директорию /var/www/all/undefined кладётся сайт-затычка при вызове несуществующих сайтов.
Если в каком-то сайте надо обрабатывать все html файлы как PHP, то в корень этого сайта надо положить пустой файл «.parse_html».
Ниже приведён конфигурационный файл сайта. Его можно положить в /etc/nginx/sites_enabled/default.

Ограничение, пожалуй, одно: рерайт только на index.php в корне. Но для 99.9% сайтов, что мне приходится окучивать, этот вариант подходит.

Code: Select all

server {
   listen 80 default; # этот конфиг - умолчательный для 80 порта
   server_name _;  # хитрый ключик, обозначающий, что этот конфиг применим для любого сайта

   set $sathost $host;  # В sathost будет лежать имя сайта. Так же должна называться директрия с сайтом
   # убираем www
   if ( $host ~ ^(www\.)?(.+)$ ) {
      set $sathost $2;
   }
   
   root   /var/www/all/$sathost; # конень сайта определяем автоматически
   index index.php index.html index.htm; # в каком порядке искать индексные файлы

   access_log off;   
#   access_log /var/log/nginx/all/$sathost_access.log; # такая комбинация, к сожалению, не работает. жду пока допилят
   error_log  /var/log/nginx/all.error.log error;

   location / {   # правила ниже применяются для любых запросов
                if (!-d /var/www/all/$sathost) { # если не нашли директорию с именем запрошенного сайта
      # переадресуем на сайт под названием undefined, который лежит в /all/undefined
      set $sathost undefined;
      rewrite ^ /index.php last;
                }

      # начало rewrite
      set $rflag 1;   # так как логического объединения в условных выражениях нет, то вводим переменную для сложения двух условий. flag указывает на необходимость сделать переадресацию
      if (-e $request_filename) { # если есть запрошенный файл, то переадресация не нужна
         set $rflag 0;
      }
      if (!-f /var/www/all/$sathost/index.php) { # если нет index.php в корне сайта, то переадресация тоже не нужна, ибо некуда
         set $rflag 0;
      }
      if ($rflag = 1) {  #
         rewrite  ^ /index.php  last;
      }
      # конец rewrite

      if (-f $request_filename) { # для статических файлов включаем кэш на час
         expires  1h;
         break;
      }
   }

   location ~ \.php$ { # этот блок сработает при запросе .php файлов
      root   /var/www/all/$sathost;
      fastcgi_pass   127.0.0.1:9000; # тут висит php-fpm
      fastcgi_index  index.php;
      fastcgi_param  SCRIPT_FILENAME  /var/www/all/$sathost/$fastcgi_script_name;
      include fastcgi_params;
      break;
   }

   location ~ \.htm(l?)$ { # этот блок работает при вызове .html или .htm
      # если в корне сайта лежит файл «.parse_html», то обрабатываем HTML как PHP
      fastcgi_param  SCRIPT_FILENAME  /var/www/all/$sathost/$fastcgi_script_name;
      include fastcgi_params;
      if (!-f $request_filename) { # даже если запросили .html, это не значит что он у нас есть
          # соотвественно, если файла нет, то тоже делаем rewrite
          rewrite  ^ /index.php  last;
      }
      if (-f /var/www/all/$sathost/.parse_html) { # проверяем на наличие метки
          # если в директории сайта лежит ключевой файлик, то все html обрабатываем как php
          fastcgi_pass   127.0.0.1:9000;
      }
      break;
   }
   

   location ~ /\.ht { # в файлах, начинающихся на «.ht» могут лежать пароли или оставшиеся настройки от Апача - отдавать это ни к чему.
      deny  all;
   }
}
Image

dyvniy M
Topic author, Администратор
Администратор
Avatar
dyvniy M
Topic author, Администратор
Администратор
Age: 36
Reputation: 1
Loyalty: 1
Posts: 3159
Joined: Wed, 10 Oct 2012
With us: 6 years 9 months
Профессия: Программист
Location: Россия, Москва
ICQ Website Skype VK

#2by dyvniy » Tue, 9 Jan 2018, 14:50:53

Documentation
Need read
https://nginx.ru/ru/docs/
Image

dyvniy M
Topic author, Администратор
Администратор
Avatar
dyvniy M
Topic author, Администратор
Администратор
Age: 36
Reputation: 1
Loyalty: 1
Posts: 3159
Joined: Wed, 10 Oct 2012
With us: 6 years 9 months
Профессия: Программист
Location: Россия, Москва
ICQ Website Skype VK

#3by dyvniy » Wed, 16 May 2018, 16:23:25

Перенаправление поддомена на порт
https://ru.stackoverflow.com/questions/465627/Пер ... а-включающего-порт-на-поддомен
Конечно вы правильно рассуждаете 127.0.0.1:80 это локальная петля и видна только локально. Указать любой домен и listen 80 - это будет публичный сервер

Code: Select all

server {
  
listen 127.0.0.1:80;
}
server {
   
listen 80;
   
server_name public.mydomain;
}
 
а также регулировать и определять доступ через proxy nginx

Code: Select all

server {
   
listen 8080;  
   
location / {
     
proxy_pass http://backend;
     // ...
   
}
То есть все серверы будут работать на 127.0.0.1 например, а доступ будет через прокси nginx. Это "один из" и очень простой и надежный вариант. Вы всегда сможете спокойно изменять адреса и порты серверов, но фронт-сервер при этом изменяться не будет.
Image


Forum name: Технокалипсис
Description: Новости науки и техники. Всё то, о чём раньше Вы могли только мечтать. Магия современности.

Quick reply


Enter the code exactly as it appears. All letters are case insensitive.
Confirmation code
:) ;) :hihi: :P :hah: :haha: :angel: :( :st: :_( :cool: 8-| :beee: :ham: :rrr: :grr: :* :secret: :stupid: :music: View more smilies
   

Return to “Технокалипсис”

Who is online (over the past 15 minutes)

Users browsing this forum: 1 guest