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

Несколько виртуальных хостов nginx Хостинг
Содержание
  1. Introduction
  2. Prerequisites
  3. Example Configuration
  4. Step 1 — Setting Up New Document Root Directories
  5. Step 2 — Creating Sample Pages for Each Site
  6. Step 3 — Creating Server Block Files for Each Domain
  7. Creating the First Server Block File
  8. Creating the Second Server Block File
  9. Step 4 — Enabling your Server Blocks and Restart Nginx
  10. Step 5 — Modifying Your Local Hosts File for Testing (Optional)
  11. Step 6 — Testing Your Results
  12. Conclusion
  13. Introduction
  14. Prerequisites
  15. Step One — Set Up New Document Root Directories
  16. Step Two — Create Sample Pages for Each Site
  17. Step Three — Create Server Block Files for Each Domain
  18. Create the First Server Block File
  19. Create the Second Server Block File
  20. Step Four — Enable your Server Blocks and Restart Nginx
  21. Step Five — Set Up Local Hosts File (Optional)
  22. Step Six — Test your Results
  23. Conclusion
  24. Введение
  25. Предварительные требования
  26. Шаг 1 — Установка Apache и PHP-FPM
  27. Шаг 2 — Настройка Apache и PHP-FPM
  28. Шаг 3 — Настройка Apache для использования mod_fastcgi
  29. Шаг 4 — Проверка функционала PHP
  30. Шаг 5 — Создание виртуальных хостов для Apache
  31. Шаг 6 — Установка и настройка Nginx
  32. Шаг 7 — Настройка Nginx для виртуальных хостов Apache
  33. Шаг 8 — Установка и настройка mod_rpaf
  34. Шаг 9 — Настройка сайтов HTTPS с Let’s Encrypt (опционально)
  35. Шаг 10 — Блокировка прямого доступа к Apache (опционально)
  36. Шаг 11 — Обслуживание статических файлов с помощью Nginx (необязательно)
  37. Заключение
  38. Установка Nginx
  39. Настройка веб-сервера Nginx
  40. Настройка Nginx Server Blocks
  41. Настройка Apache

Introduction

Prerequisites

When you have fulfilled these requirements, you can continue on with this guide.

Example Configuration

For demonstration purposes, we’re going to set up two domains with our Nginx server. The domain names we’ll use in this guide are example.com and test.com.

If you do not have two spare domain names to play with, use placeholder names for now and we’ll show you later how to configure your local computer to test your configuration.

Step 1 — Setting Up New Document Root Directories

While this works well for a single site, we need additional directories if we’re going to serve multiple sites. We can consider the /var/www/html directory the default directory that will be served if the client request doesn’t match any of our other sites.

We will create a directory structure within /var/www for each of our sites. The actual web content will be placed in an html directory within these site-specific directories. This gives us some additional flexibility to create other directories associated with our sites as siblings to the html directory if necessary.

We need to create these directories for each of our sites. The -p flag tells mkdir to create any necessary parent directories along the way:

  1. /var/www/example.com/html
  2. /var/www/test.com/html
  1. /var/www/example.com/html
  2. /var/www/test.com/html

The permissions of our web roots should be correct already if you have not modified your umask value, but we can make sure by typing:

  1. /var/www

Our directory structure is now configured and we can move on.

Step 2 — Creating Sample Pages for Each Site

Now that we have our directory structure set up, let’s create a default page for each of our sites so that we will have something to display.

Create an index.html file in your first domain:

  1. /var/www/example.com/html/index.html

Inside the file, we’ll create a really basic file that indicates what site we are currently accessing. It will look like this:

<html> <head> <title>Welcome to Example.com!</title> </head> <body> <h1>Success! The example.com server block is working!</h1> </body>
</html>

Save and close the file when you are finished. To do this in nano, press CTRL+o to write the file out, then CTRL+x to exit.

Since the file for our second site is basically going to be the same, we can copy it over to our second document root like this:

  1. /var/www/example.com/html/index.html /var/www/test.com/html/

Now, we can open the new file in our editor:

  1. /var/www/test.com/html/index.html

Modify it so that it refers to our second domain:

<html> <head> <title>Welcome to Test.com!</title> </head> <body> <h1>Success! The test.com server block is working!</h1> </body>
</html>

Save and close this file when you are finished. We now have some pages to display to visitors of our two domains.

Step 3 — Creating Server Block Files for Each Domain

Creating the First Server Block File

  1. /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

Now, open the new file you created in your text editor with sudo privileges:

  1. /etc/nginx/sites-available/example.com

Ignoring the commented lines, the file will look similar to this:

server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri/ =404; }
}
server { listen 80; listen [::]:80; . . .
}

Note: You can check that the default_server option is only enabled in a single active file by typing:

  1. default_server /etc/nginx/sites-enabled/

If matches are found uncommented in more than on file (shown in the leftmost column), Nginx will complain about an invalid configuration.

The next thing we’re going to have to adjust is the document root, specified by the root directive. Point it to the site’s document root that you created:

server { listen 80; listen [::]:80; root /var/www/example.com/html;
}

Next, we need to modify the server_name to match requests for our first domain. We can additionally add any aliases that we want to match. We will add a www.example.com alias to demonstrate.

When you are finished, your file will look something like this:

server { listen 80; listen [::]:80; root /var/www/example.com/html; index index.html index.htm index.nginx-debian.html; server_name example.com www.example.com; location / { try_files $uri $uri/ =404; }
}

That is all we need for a basic configuration. Save and close the file to exit.

Creating the Second Server Block File

  1. /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com

Open the new file with sudo privileges in your editor:

  1. /etc/nginx/sites-available/test.com

Again, make sure that you do not use the default_server option for the listen directive in this file if you’ve already used it elsewhere. Adjust the root directive to point to your second domain’s document root and adjust the server_name to match your second site’s domain name (make sure to include any aliases).

When you are finished, your file will likely look something like this:

server { listen 80; listen [::]:80; root /var/www/test.com/html; index index.html index.htm index.nginx-debian.html; server_name test.com www.test.com; location / { try_files $uri $uri/ =404; }
}

When you are finished, save and close the file.

Step 4 — Enabling your Server Blocks and Restart Nginx

We can create these links by typing:

  1. /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
  2. /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/
  • example.com: Will respond to requests for example.com and www.example.com
  • test.com: Will respond to requests for test.com and www.test.com
  • default: Will respond to any requests on port 80 that do not match the other two blocks.

In order to avoid a possible hash bucket memory problem that can arise from adding additional server names, we will also adjust a single value within our /etc/nginx/nginx.conf file. Open the file now:

  1. /etc/nginx/nginx.conf

Within the file, find the server_names_hash_bucket_size directive. Remove the # symbol to uncomment the line:

http { . . . server_names_hash_bucket_size 64; . . .
}

Save and close the file when you are finished.

Next, test to make sure that there are no syntax errors in any of your Nginx files:

  1. nginx

If no problems were found, restart Nginx to enable your changes:

  1. systemctl restart nginx

Nginx should now be serving both of your domain names.

Step 5 — Modifying Your Local Hosts File for Testing (Optional)

This will not allow other visitors to view your site correctly, but it will give you the ability to reach each site independently and test your configuration. This works by intercepting requests that would usually go to DNS to resolve domain names. Instead, we can set the IP addresses we want our local computer to go to when we request the domain names.

If you are on a Mac or Linux computer at home, you can edit the file needed by typing:

  1. /etc/hosts

If you are on Windows, you can find instructions for altering your hosts file here.

You need to know your server’s public IP address and the domains you want to route to the server. Assuming that my server’s public IP address is 203.0.113.5, the lines I would add to my file would look something like this:

127.0.0.1 localhost
. . .203.0.113.5 example.com www.example.com203.0.113.5 test.com www.test.com

This will intercept any requests for example.com and test.com and send them to your server, which is what we want if we don’t actually own the domains that we are using.

Save and close the file when you are finished.

Step 6 — Testing Your Results

http://example.com

You should see a page that looks like this:

Nginx first server block

If you visit your second domain name, you should see a slightly different site:

http://test.com

Nginx second server block

At this point, if you adjusted your hosts file on your local computer in order to test, you’ll probably want to remove the lines you added.

If you need domain name access to your server for a public-facing site, you will probably want to purchase a domain name for each of your sites.

Conclusion

You should now have the ability to create server blocks for each domain you wish to host from the same server. There aren’t any real limits on the number of server blocks you can create, so long as your hardware can handle the traffic.

Читайте также:  Блог | Tucha.ua

Introduction

Prerequisites

sudo apt-get update
sudo apt-get install nginx

When you have fulfilled these requirements, you can continue on with this guide.

For demonstration purposes, we’re going to set up two domains with our Nginx server. The domain names we’ll use in this guide are example.com and test.com.

You can find a guide on how to set up domain names with DigitalOcean here. If you do not have two spare domain names to play with, use dummy names for now and we’ll show you later how to configure your local computer to test your configuration.

Step One — Set Up New Document Root Directories

/usr/share/nginx/html

We won’t use the default since it is easier to work with things in the /var/www directory. Ubuntu’s Nginx package does not use /var/www as its document root by default due to a Debian policy about packages utilizing /var/www.

  1. /var/www/example.com/html
  2. /var/www/test.com/html
  1. /var/www/example.com/html
  2. /var/www/test.com/html

The permissions of our web roots should be correct already if you have not modified your umask value, but we can make sure by typing:

  1. /var/www

Our directory structure is now configured and we can move on.

Step Two — Create Sample Pages for Each Site

Now that we have our directory structure set up, let’s create a default page for each of our sites so that we will have something to display.

Create an index.html file in your first domain:

  1. /var/www/example.com/html/index.html

Inside the file, we’ll create a really basic file that indicates what site we are currently accessing. It will look like this:

<html> <head> <title>Welcome to Example.com!</title> </head> <body> <h1>Success! The example.com server block is working!</h1> </body>
</html>

Save and close the file when you are finished.

Since the file for our second site is basically going to be the same, we can copy it over to our second document root like this:

  1. /var/www/example.com/html/index.html /var/www/test.com/html/

Now, we can open the new file in our editor and modify it so that it refers to our second domain:

  1. /var/www/test.com/html/index.html
<html> <head> <title>Welcome to Test.com!</title> </head> <body> <h1>Success! The test.com server block is working!</h1> </body>
</html>

Save and close this file when you are finished. You now have some pages to display to visitors of our two domains.

Step Three — Create Server Block Files for Each Domain

Create the First Server Block File

  1. /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

Now, open the new file you created in your text editor with root privileges:

  1. /etc/nginx/sites-available/example.com

Ignoring the commented lines, the file will look similar to this:

server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /usr/share/nginx/html; index index.html index.htm; server_name localhost; location / { try_files $uri $uri/ =404; }
}

The next thing we’re going to have to adjust is the document root, specified by the root directive. Point it to the site’s document root that you created:

root /var/www/example.com/html;

Note: Each Nginx statement must end with a semi-colon (;), so check each of your lines if you are running into problems.

Next, we want to modify the server_name to match requests for our first domain. We can additionally add any aliases that we want to match. We will add a www.example.com alias to demonstrate:

server_name example.com www.example.com;

When you are finished, your file will look something like this:

server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /var/www/example.com/html; index index.html index.htm; server_name example.com www.example.com; location / { try_files $uri $uri/ =404; }
}

That is all we need for a basic configuration. Save and close the file to exit.

Create the Second Server Block File

  1. /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com

Open the new file with root privileges in your editor:

  1. /etc/nginx/sites-available/test.com

In this new file, we’re going to have to look at the listen directives again. If you left the default_server option enabled in the last file, you’ll have to remove it in this file. Furthermore, you’ll have to get rid of the ipv6only=on option, as it can only be specified once per address/port combination:

listen 80;
listen [::]:80;

Adjust the document root directive to point to your second domain’s document root:

root /var/www/test.com/html;

Adjust the server_name to match your second domain and any aliases:

server_name test.com www.test.com;

Your file should look something like this with these changes:

server { listen 80; listen [::]:80; root /var/www/test.com/html; index index.html index.htm; server_name test.com www.test.com; location / { try_files $uri $uri/ =404; }
}

When you are finished, save and close the file.

Step Four — Enable your Server Blocks and Restart Nginx

We can do this by creating symbolic links from these files to the sites-enabled directory, which Nginx reads from during startup.

We can create these links by typing:

  1. /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
  2. /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/
  1. /etc/nginx/sites-enabled/default

We also need to adjust one setting really quickly in the default Nginx configuration file. Open it up by typing:

  1. /etc/nginx/nginx.conf

We just need to uncomment one line. Find and remove the comment from this:

server_names_hash_bucket_size 64;

Now, we are ready to restart Nginx to enable your changes. You can do that by typing:

  1. nginx restart

Nginx should now be serving both of your domain names.

Step Five — Set Up Local Hosts File (Optional)

This will not allow other visitors to view your site correctly, but it will give you the ability to reach each site independently and test your configuration. This basically works by intercepting requests that would usually go to DNS to resolve domain names. Instead, we can set the IP addresses we want our local computer to go to when we request the domain names.

If you are on a Mac or Linux computer at home, you can edit the file needed by typing:

  1. /etc/hosts

If you are on Windows, you can find instructions for altering your hosts file here.

You need your server’s public IP address and the domains you want to route to the server. Assuming that my server’s public IP address is 111.111.111.111, the lines I would add to my file would look something like this:

127.0.0.1 localhost
127.0.0.1 guest-desktop
111.111.111.111 example.com111.111.111.111 test.com

This will intercept any requests for example.com and test.com and send them to your server, which is what we want if we don’t actually own the domains that we are using.

Save and close the file when you are finished.

Step Six — Test your Results

http://example.com

You should see a page that looks like this:

Nginx first server block

If you visit your second domain name, you should see a slightly different site:

http://test.com

Nginx second server block

At this point, if you adjusted your hosts file on your local computer in order to test, you’ll probably want to remove the lines you added.

If you need domain name access to your server for a public-facing site, you will probably want to purchase a domain name for each of your sites. You can learn how to set them up to point to your server here.

Conclusion

You should now have the ability to create server blocks for each domain you wish to host from the same server. There aren’t any real limits on the number of server blocks you can create, so long as your hardware can handle the traffic.

Автор выбрал фонд Electronic Frontier Foundation для получения пожертвований в рамках программы Write for DOnations.

Введение

Серверы, имеющие адреса IPv4 и IPv6, можно настроить для обслуживания сайтов Apache через один протокол и сайтов Nginx через другой протокол, однако это не самый практичный вариант, поскольку еще не все провайдеры поддерживают протокол IPv6. Другое решение заключается в использовании разных номеров портов (напрмер, 81 или 8080) для второго веб-серверна, однако публикация URL-адресов с номерами портов (в формате http://example.com:81) не всегда является разумным или идеальным решением.

В этом руководстве вы настроите Nginx как веб-сервер и обратный прокси-сервер для Apache — все на одном сервере.

В зависимости от веб-приложения для обеспечения осведомленности Apache о присутствии обратного прокси-сервера могут потребоваться изменения кода, особенно если настроены сайты SSL. Чтобы избежать этого, нужно установить модуль Apache под названием mod_rpaf, который перезаписывает определенные переменные среды так, что все выглядит, как если бы Apache напрямую обрабатывал запросы веб-клиентов.

Мы разместим четыре доменных имени на одном сервере. Два из них будут обслуживаться Nginx: example.com (виртуальный хост по умолчанию) и sample.org. Остальные два, foobar.net и test.io, будут обслуживаться Apache. Также мы настроим Apache для обслуживания приложений PHP с использованием PHP-FPM, что обеспечивает более высокую производительность по сравнению с mod_php.

Предварительные требования

Для прохождения данного обучающего руководства вам потребуется следующее:

Шаг 1 — Установка Apache и PHP-FPM

Начнем с установки Apache и PHP-FPM.

Помимо Apache и PHP-FPM мы также установим модуль PHP FastCGI Apache, libapache2-mod-fastcgi, для поддержки веб-приложений FastCGI.

Вначале обновите свой список пакетов и убедитесь, что у вас установлены последние версии пакетов.

  1. update

Затем выполните установку пакетов Apache и PHP-FPM:

  1. apache2 php-fpm

Модуль FastCGI Apache недоступен в хранилище Ubuntu, и поэтому вам следует загрузить его с kernel.org и установить с помощью команды dpkg.

  1. https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
  2. dpkg libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb

Далее изменим конфигурацию Apache по умолчанию для использования PHP-FPM.

Шаг 2 — Настройка Apache и PHP-FPM

На этом шаге мы изменим номер порта Apache на 8080 и настроим его для работы с PHP-FPM с использованием модуля mod_fastcgi. Переименуйте файл конфигурации Apache ports.conf:

  1. /etc/apache2/ports.conf /etc/apache2/ports.conf.default

Создайте новый файл ports.conf и установите в нем порт 8080:

  1. /etc/apache2/ports.conf

Далее мы создадим файл виртуального хоста для Apache. Директива <VirtualHost> этого файла будет установлена для обслуживания только сайтов на порту 8080.

Отключите виртуальный хост по умолчанию:

  1. a2dissite 000-default

Затем создайте новый файл виртуального хоста, используя существующий сайт по умолчанию:

  1. /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf

Откройте новый файл конфигурации:

  1. /etc/apache2/sites-available/001-default.conf

Измените порт прослушивания на 8080:

<VirtualHost *:8080> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Сохраните файл и активируйте новый файл конфигурации:

  1. a2ensite 001-default

Затем перезагрузите Apache:

  1. systemctl reload apache2

Убедитесь, что Apache прослушивает порт 8080:

Результат должен выглядеть как в следующем примере, где apache2 прослушивает порт 8080:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1086/sshdtcp6 0 0 :::8080 :::* LISTEN 4678/apache2tcp6 0 0 :::22 :::* LISTEN 1086/sshd

Убедившись, что Apache прослушивает правильный порт, вы можете настроить поддержку PHP и FastCGI.

Читайте также:  Стоит ли сегодня создавать свой хостинг? Интервью с Д. Имшенецким

Шаг 3 — Настройка Apache для использования mod_fastcgi

По умолчанию Apache обслуживает страницы PHP с помощью модуля mod_php, однако для работы с PHP-FPM ему требуется дополнительная настройка.

Примечание. Если вы пытаетесь использовать это обучающее руководство в существующей системе LAMP с mod_php, вначале выполните отключение с помощью команды sudo a2dismod php7.2.

Мы добавим блок конфигурации для mod_fastcgi, зависящий от mod_action. По умолчанию mod_action отключен, и предварительно его нужно включить:

  1. a2enmod actions

Переименуйте существующий файл конфигурации FastCGI:

  1. /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default

Создайте новый файл конфигурации:

  1. /etc/apache2/mods-enabled/fastcgi.conf

Добавьте в файл следующие директивы для передачи запросов файлов .php в сокет PHP-FPM UNIX:

<IfModule mod_fastcgi.c> AddHandler fastcgi-script .fcgi FastCgiIpcDir /var/lib/apache2/fastcgi AddType application/x-httpd-fastphp .php Action application/x-httpd-fastphp /php-fcgi Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi -socket /run/php/php7.2-fpm.sock -pass-header Authorization <Directory /usr/lib/cgi-bin> Require all granted </Directory>
</IfModule>

Сохраните изменения и проведите тест конфигурации:

  1. apachectl

Если отображается Syntax OK, перезагрузите Apache:

  1. systemctl reload apache2

Если отображается предупреждение Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message., его можно игнорировать. Мы настроим имена серверов позднее.

Теперь убедимся, что мы можем обслуживать PHP из Apache.

Шаг 4 — Проверка функционала PHP

Чтобы убедиться, что PHP работает, мы создадим файл phpinfo() и получим к нему доступ к через браузер.

Создайте файл /var/www/html/info.php, содержащий вызов функции phpinfo:

  1. "<?php phpinfo(); ?>" /var/www/html/info.php

Чтобы просмотреть файл в браузере, откройте адрес http://your_server_ip:8080/info.php. На странице появится перечень параметров конфигурации, используемых PHP. Результат будет выглядеть примерно так:

phpinfo Server API

phpinfo PHP Variables

Убедитесь, что в Server API вверху страницы указано значение FPM/FastCGI. Раздел «Переменные PHP» в нижней трети страницы покажет, что параметр SERVER_SOFTWARE имеет значение Apache на Ubuntu. Это подтверждает, что модуль mod_fastcgi активен, и что Apache использует PHP-FPM для обработки файлов PHP.

Шаг 5 — Создание виртуальных хостов для Apache

Давайте создадим файлы виртуальных хостов Apache для доменов foobar.net и test.io. Для этого мы вначале создадим корневые каталоги документов document root для обоих сайтов и разместим в эти каталоги файлы, чтобы можно было легко протестировать нашу конфигурацию.

Вначале создайте корневые каталоги документа:

  1. /var/www/foobar.net /var/www/test.io

Затем создайте файл index для каждого сайта:

  1. "<h1 style='color: green;'>Foo Bar</h1>" /var/www/foobar.net/index.html
  2. "<h1 style='color: red;'>Test IO</h1>" /var/www/test.io/index.html

Далее создайте файл phpinfo() для каждого сайта, чтобы мы могли протестировать правильность конфигурации PHP.

  1. "<?php phpinfo(); ?>" /var/www/foobar.net/info.php
  2. "<?php phpinfo(); ?>" /var/www/test.io/info.php

Теперь создайте файл виртуального хоста для домена foobar.net:

  1. /etc/apache2/sites-available/foobar.net.conf

Добавьте в файл следующий код для определения хоста:

 <VirtualHost *:8080> ServerName foobar.net ServerAlias www.foobar.net DocumentRoot /var/www/foobar.net <Directory /var/www/foobar.net> AllowOverride All </Directory> </VirtualHost>

Строка AllowOverride All активирует поддержку .htaccess.

Это только базовые указания. Полное руководство по по настройке виртуальных хостов в Apache можно найти в документе «Настройка виртуальных хостов Apache в Ubuntu 16.04».

Сохраните и закройте файл. Затем создайте аналогичную конфигурацию для test.io. Сначала создайте файл:

  1. /etc/apache2/sites-available/test.io.conf

Затем добавьте в файл конфигурацию:

 <VirtualHost *:8080> ServerName test.io ServerAlias www.test.io DocumentRoot /var/www/test.io <Directory /var/www/test.io> AllowOverride All </Directory> </VirtualHost>

Сохраните файл и выйдите из редактора.

Теперь, когда вы создали оба виртуальных хоста Apache, разрешите сайтам использовать команду a2ensite. Это создаст символическую связь с файлом виртуального хоста в каталоге sites-enabled:

  1. a2ensite foobar.net
  2. a2ensite test.io

Снова проверьте Apache на наличие ошибок конфигурации:

  1. apachectl

При отсутствии ошибок появится сообщение Syntax OK. Если появится любое другое сообщение, проверьте конфигурацию и повторите попытку.

Когда в конфигурации не останется ошибок, перезагрузите Apache, чтобы применить изменения:

  1. systemctl reload apache2

Чтобы подтвердить работу сайтов, откройте в браузере адреса http://foobar.net:8080 и http://test.io:8080 и убедитесь, что для каждого из сайтов отображается файл index.html.

Вы увидите следующие результаты:

страница индекса foobar.net

страница индекса test.io

Также попробуйте получить доступ к файлам info.php files каждого сайта, чтобы убедиться в работе PHP. Откройте адреса http://foobar.net:8080/info.php и http://test.io:8080/info.php в браузере.

Для каждого сайта вы увидите такой же перечень настроек PHP, что и на шаге 4.

Мы разместили два сайта на сервере Apache на порту 8080. Теперь давайте настроим Nginx.

Шаг 6 — Установка и настройка Nginx

На этом шаге мы выполним установку Nginx и настроим домены example.com и sample.org как виртуальные хосты Nginx. Полное руководство по настройке виртуальных хостов в Nginx можно найти в документе «Настройка блоков сервера Nginx (виртуальных хостов) в Ubuntu 18.04».

Установите Nginx с помощью диспетчера пакетов:

  1. nginx

Затем удалите соединение symlink по умолчанию виртуального хоста, поскольку мы больше не будем его использовать:

  1. /etc/nginx/sites-enabled/default

Позднее мы создадим собственный сайт по умолчанию (example.com).

Теперь мы создадим виртуальные хосты для Nginx, используя ту же процедуру, что использовалась для Apache. Вначале необходимо создать корневые каталоги документов для обоих сайтов:

  1. /usr/share/nginx/example.com /usr/share/nginx/sample.org

Как и в случае с виртуальными хостами Apache, после завершения настройки следует создать файлы index и phpinfo() для тестирования:

  1. "<h1 style='color: green;'>Example.com</h1>" /usr/share/nginx/example.com/index.html
  2. "<h1 style='color: red;'>Sample.org</h1>" /usr/share/nginx/sample.org/index.html
  3. "<?php phpinfo(); ?>" /usr/share/nginx/example.com/info.php
  4. "<?php phpinfo(); ?>" /usr/share/nginx/sample.org/info.php

Теперь создайте файл виртуального хоста для домена example.com:

  1. /etc/nginx/sites-available/example.com
  default_server  index.php index.html index.htm  example.com www.example.com  / /index.php  ~ \.php$ 

Сохраните и закройте файл. Создайте файл виртуального хоста для второго домена Nginx, sample.org:

  1. etc/nginx/sites-available/sample.org

Добавьте в файл следующее:

  index.php index.html index.htm  sample.org www.sample.org  / /index.php  ~ \.php$ 

Сохраните и закройте файл.

Затем активируйте оба сайта, создав символические ссылки на каталог sites-enabled:

  1. /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
  2. /etc/nginx/sites-available/sample.org /etc/nginx/sites-enabled/sample.org

Протестируйте конфигурацию Nginx и убедитесь в отсутствии проблем с конфигурацией:

  1. nginx

При обнаружении ошибок перезагрузите Nginx:

  1. systemctl reload nginx

Получите доступ к файлу phpinfo() виртуальных хостов Nginx через браузер по адресам http://example.com/info.php и http://sample.org/info.php. Снова изучите разделы PHP Variables.

Переменные Nginx PHP Variables

К настоящему моменту мы установили Nginx и создали два виртуальных хоста. Далее мы настроим Nginx на запросы прокси-сервера, предназначенные для доменов Apache.

Шаг 7 — Настройка Nginx для виртуальных хостов Apache

Создадим дополнительный виртуальный хост Nginx с несколькими именами доменов в директивах server_name. Запросы этих доменных имен будут перенаправляться через прокси-сервер в Apache.

Создайте новый файл виртуального хоста Nginx для перенаправления запросов в Apache:

  1. /etc/nginx/sites-available/apache
  foobar.net www.foobar.net test.io www.test.io  Host   X-Real-IP   X-Forwarded-For   X-Forwarded-Proto  

Сохраните файл и активируйте новый файл виртуального хоста, создав символическую ссылку:

  1. /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache

Протестируйте конфигурацию и убедитесь в отсутствии ошибок:

  1. nginx

Если ошибок нет, перезагрузите Nginx:

  1. systemctl reload nginx

Откройте в браузере URL-адрес http://foobar.net/info.php. Перейдите в раздел PHP Variables и проверьте отображаемые значения.

phpinfo для Apache через Nginx

Мы успешно настроили Nginx для перенаправления запросов определенных доменов в Apache через прокси-сервер. Теперь настроим Apache для установки переменной REMOTE_ADDR, как если бы эти запросы обрабатывались напрямую.

Шаг 8 — Установка и настройка mod_rpaf

На этом шаге вы установите модуль Apache под названием mod\_rpaf, который перезаписывает значения REMOTE_ADDR, HTTPS и HTTP_PORT на базе значений, предоставленных обратным прокси-сервером. Без этого модуля для некоторых приложений PHP потребуется изменение кода для бесшовной работы из-за прокси-сервера. Этот модуль представлен в хранилище Ubuntu как libapache2-mod-rpaf, однако он устарел и не поддерживает некоторые директивы конфигурации. Поэтому мы установим его из источника.

Установите пакеты, необходимые для построения модуля:

  1. build-essential apache2-dev

Загрузите последний стабильный выпуск из GitHub:

  1. https://github.com/gnif/mod_rpaf/archive/stable.zip

Выполните извлечение загруженного файла:

  1. stable.zip

Перейдите в новый каталог, содержащий файлы:

  1. mod_rpaf-stable

Скомпилируйте и установите модуль:

Затем создайте в каталоге mods-available файл, который будет загружать модуль rpaf,

  1. /etc/apache2/mods-available/rpaf.load

Добавьте в файл следующий код для загрузки модуля:

LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so

Сохраните файл и выйдите из редактора.

Создайте в этом каталоге другой файл с именем rpaf.conf, который будет содержать директивы конфигурации для mod_rpaf:

  1. /etc/apache2/mods-available/rpaf.conf
 <IfModule mod_rpaf.c> RPAF_Enable On RPAF_Header X-Real-Ip RPAF_ProxyIPs your_server_ip RPAF_SetHostName On RPAF_SetHTTPS On RPAF_SetPort On </IfModule>

Здесь приведено краткое описание каждой директивы. Дополнительную информацию можно найти в файле README по модулю mod_rpaf.

  • RPAF_Header — заголовок, используемый для реального IP-адреса клиента.
  • RPAF_ProxyIPs — IP-адрес прокси-сервера для корректировки запросов HTTP.
  • RPAF_SetHostName — обновляет имя vhost так, чтобы работали параметры ServerName и ServerAlias.
  • RPAF_SetHTTPS — задает переменную среды HTTPS на основе значения, содержащегося в X-Forwarded-Proto.
  • RPAF_SetPort — задает переменную среды SERVER_PORT. Полезна для использования, когда сервер Apache находится за прокси-сервером SSL.

Сохраните rpaf.conf и активируйте модуль:

  1. a2enmod rpaf

При этом создаются символические ссылки файлов rpaf.load и rpaf.conf в каталоге mods-enabled. Теперь протестируем конфигурацию:

  1. apachectl

Если ошибок нет, перезагрузите Apache:

  1. systemctl reload apache2

Откройте в браузере страницы phpinfo() по адресам http://foobar.net/info.php и http://test.io/info.php и проверьте раздел PHP Variables. Переменная REMOTE_ADDR также будет использоваться для публичного IP-адрса вашего локального компьютера.

Теперь настроим шифрование TLS/SSL для каждого сайта.

Шаг 9 — Настройка сайтов HTTPS с Let’s Encrypt (опционально)

На этом шаге мы настроим сертификаты TLS/SSL для обоих доменов, размещенных в Apache. Мы получим сертификаты посредством Let’s Encrypt. Nginx поддерживает конечные узлы SSL, и поэтому мы можем настроить SSL без изменения файлов конфигурации Apache. Модуль mod_rpaf обеспечивает установку в Apache переменных среды, необходимых для бесшовной работы приложений за обратным прокси-сервером SSL.

  1. /etc/nginx/sites-available/apache

Измените файл, чтобы он выглядел следующим образом, сайты foobar.net и test.io должны находиться в собственных server блоках:

  foobar.net www.foobar.net  Host   X-Real-IP   X-Forwarded-For   X-Forwarded-Proto   test.io www.test.io  Host   X-Real-IP   X-Forwarded-For   X-Forwarded-Proto  

Мы используем Certbot для генерирования сертификатов TLS/SSL. Плагин Nginx изменит конфигурацию Nginx и перезагрузит ее, когда это потребуется.

Читайте также:  Откройте для себя лучшие домены Postfix Relay для эффективной отправки электронной почты

Прежде всего, добавьте официальное хранилище Certbot:

  1. add-apt-repository ppa:certbot/certbot

Нажмите ENTER в диалоге, чтобы подтвердить добавление нового хранилища. Обновите список пакетов, чтобы получить данные пакета нового хранилища:

  1. update

Установите пакет Certbot’s Nginx с apt:

  1. python-certbot-nginx

После установки используйте команду certbot для генерирования сертификатов для foobar.net и www.foobar.net:

  1. certbot foobar.net www.foobar.net

Эта команда указывает Certbot, что нужно использовать плагин nginx, а параметр -d задает имена, для которых должен действовать сертификат.

Если это первый запуск certbot, вам будет предложено указать адрес эл. почты и принять условия обслуживания. После этого certbot свяжется с сервером Let’s Encrypt и отправит запрос с целью подтвердить, что вы контролируете домен, для которого запрашиваете сертификат.

Далее Certbot запросит желаемый вариант настройки HTTPS:

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Выберите желаемый вариант и нажмите ENTER. Конфигурация будет обновлена, а затем будет выполнена перезагрузка Nginx для активации новых настроек.

Теперь выполните команду для второго домена:

  1. certbot test.io www.test.io

Откройте один из доменов Apache в браузере с помощью префикса https://; откройте https://foobar.net/info.php, и вы увидите следующее:

phpinfo ssl

Посмотрите раздел PHP Variables. Для переменной SERVER_PORT задано значение 443 и протокол HTTPS включен, как если бы осуществлялся прямой доступ к Apache через HTTPS. При такой настройке переменных не нужно специально настраивать приложения PHP для работы за обратным прокси-сервером.

Теперь отключим прямой доступ к Apache.

Шаг 10 — Блокировка прямого доступа к Apache (опционально)

  1. iptables INPUT tcp your_server_ip REJECT --reject-with tcp-reset

Браузер должен вывести сообщение об ошибке Unable to connect (Не удается подключиться) или Webpage is not available (Страница недоступна). Если используется опция IPtables tcp-reset, сторонний наблюдатель не увидит разницы между портом 8080 и портом, где отсутствует какое-либо обслуживание.

Теперь настроим Nginx для обслуживания статических файлов для сайтов Apache.

Шаг 11 — Обслуживание статических файлов с помощью Nginx (необязательно)

Когда Nginx перенаправляет запросы доменов Apache через прокси-сервер, каждый запрос файла этого домена отправляется в Apache. Nginx обслуживает статические файлы, такие как изображения, JavaScript и таблицы стилей, быстрее Apache. Поэтому мы настроим файл виртуального хоста Nginx apache для прямого обслуживания статических файлов и перенаправления запросов PHP в Apache.

Откройте в своем редакторе файл /etc/nginx/sites-available/apache:

  1. /etc/nginx/sites-available/apache

Вам потребуется добавить два дополнительных блока location в каждый блок server, а также изменить существующие разделы location. Кроме того, вам нужно будет указать Nginx, где можно найти статические файлы для каждого сайта.

Если вы решили не использовать сертификаты SSL и TLS, измените свой файл, чтобы он выглядел следующим образом:

  test.io www.test.io  index.php index.htm index.html  / /index.php  ~ \.php$  Host   X-Real-IP   X-Forwarded-For   X-Forwarded-Proto   ~ /\.ht  foobar.net www.foobar.net  index.php index.htm index.html  / /index.php  ~ \.php$  Host   X-Real-IP   X-Forwarded-For   X-Forwarded-Proto   ~ /\.ht 

Если вы также хотите обеспечить доступность HTTPS, используйте следующую конфигурацию:

  test.io www.test.io  index.php index.htm index.html  / /index.php  ~ \.php$  Host   X-Real-IP   X-Forwarded-For   X-Forwarded-Proto   ~ /\.ht  ssl  foobar.net www.foobar.net  index.php index.htm index.html  / /index.php  ~ \.php$  Host   X-Real-IP   X-Forwarded-For   X-Forwarded-Proto   ~ /\.ht  ssl 

Директива try_files указывает Nginx искать файлы в корне документа document root и выводить их напрямую. Если файл имеет расширение .php, запрос перенаправляется в Apache. Даже если файл отсутствует в document root, запрос перенаправляется в Apache, чтобы функции приложения (например, постоянные ссылки) работали без проблем.

Предупреждение. Директива location ~ /\.ht очень важна, поскольку она не дает Nginx выводить содержимое файлов конфигурации Apache с важными данными, таких как .htaccess и .htpasswd.

Сохраните файл и проведите тест конфигурации:

  1. nginx

Если тест завершается успешно, перезагрузите Nginx:

  1. nginx reload

Чтобы убедиться, что все работает, вы можете просмотреть файлы журнала Apache в каталоге /var/log/apache2 и посмотреть запросы GET для файлов info.php сайтов test.io и foobar.net. Используйте команду tail для просмотра последних нескольких строк файла и параметр -f для просмотра изменений файла:

  1. /var/log/apache2/other_vhosts_access.log

Теперь откройте в браузере http://test.io/info.php и посмотрите на результаты вывода журнала. Вы увидите ответ Apache:

 test.io:80 your_server_ip - - [01/Jul/2016:18:18:34 -0400] "GET /info.php HTTP/1.0" 200 20414 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"

Затем откройте страницы index.html каждого сайта, и вы не увидите записи журнала Apache. Их обслуживает Nginx.

Завершив изучение файла журнала, нажмите CTRL+C, чтобы остановить отслеживание.

При такой настройке Apache не сможет ограничивать доступ к статическим файлам. Контроль доступа к статическим файлам должен быть настроен в файле apache виртуального хоста Nginx, однако это не входит в содержание настоящего обучающего руководства.

Заключение

Вы настроили один сервер Ubuntu, где Nginx обслуживает сайты example.com и sample.org, а Apache обслуживает сайты foobar.net и test.io. Хотя Nginx выступает в качестве обратного прокси-сервера Apache, прокси-служба Nginx невидима, и подключение к доменам Apache выглядит так, как если бы оно напрямую обслуживалось Apache. Вы можете использовать этот метод для вывода защищенных и статичных сайтов.

На сегодняшний день Nginx является одним из самых распространённых веб-серверов, используемым огромным количеством сайтов в интернете. Ниже, о том, как установить и настроить Nginx Server Blocks на сервере с установленной Ubuntu 20.04.

Установка Nginx

Nginx можно установить из репозиториев Ubuntu, поэтому для исталляции пакета необходимо ввести следующие команды, подключившись для этого к системе с помощью учётной записи, имеющей привилегию на запуск утилиты sudo:

$ sudo apt update

Первая команда обновляет список пакетов вашей системы.

$ sudo apt install nginx

Вторая команда как раз и выполняет установку элементов сервера Nginx на вашу систему.

Настройка веб-сервера Nginx

Здесь важно понимать, что Nginx использует интерфейс межсетевого экрана Uncomplicated FireWall (UFW), поэтому первым делом нужно произвести настройку брандмауэра Ubuntu. Доступные приложения, о которых знает UFW, можно увидеть набрав в командной строке:

$ sudo ufw app list
Список приложений, известных UFW

В нашем случае имеет смысл разрешить трафик HTTP. Для этого необходимо ввести:

$ sudo ufw allow 'Nginx HTTP'

Не будет лишним увидеть статус UFW после произведённых манипуляций:

$ sudo ufw status
Проверка статуса UFW

И, наконец, чтобы проверить статус установленного веб-сервера, используйте следующую инструкцию:

$ systemctl status nginx
Статус Nginx
IP-адрес VPS

Если всё сделано верно, браузер должен показать стартовую страницу Nginx:

Стартовая страница Nginx

Настройка Nginx Server Blocks

Стоит отметить, что веб-сервер Nginx может служить хостингом не только одного, но и нескольких сайтов одновременно. Для этого необходимо создать на нём дополнительные виртуальные хосты, каждый из которых будет хранить данные своего отдельного домена.

Данные сайта изначально расположены в каталоге /var/www/html. Чтобы добавить ещё один домен, необходимо создать директорию /my-domain.host/html, где my-domain.host – имя создаваемого домена, в /var/www с соответствующими правами:

$ sudo mkdir -p /var/www/my-domain.host/html$ sudo chown -R $USER:$USER /var/www/my-domain.host/html$ sudo chmod -R 755 /var/www/my-domain.host

Теперь, когда есть директория домена, в ней можно создать файл страницы сайта index.html:

$ sudo nano /var/www/my-domain.host/html/index.html
<html> <head> <title> Domain on Nginx </title> </head> <body>  <h1> Connection to my-domain.host is created successfully!!! </h1> </body></html>

Чтобы сохранить изменения и выйти из текстового редактора используйте CNTRL X, после чего Y и Enter.

Далее, в каталоге /etc/nginx/sites-available/ необходимо создать файл my-domain.host:

$ sudo nano /etc/nginx/sites-available/my-domain.host

и скопируйте в него:

server { listen 80; listen [::]:80; root /var/www/my-domain.host/html; index index.html index.htm index.nginx-debian.html; server_name my-domain.host www.my-domain.host; location / { try_files $uri $uri/ =404; } }

После того, как произведена замена server_name на имя вашего домена, необходимо создать ссылку в /etc/nginx/sites-enabled/:

$ sudo ln -s /etc/nginx/sites-available/my-domain.host /etc/nginx/sites-enabled/

Также, необходимо отредактировать файл /etc/nginx/nginx.conf:

$ sudo nano /etc/nginx/nginx.conf

а именно, раскомментируйте строку, содержащую server_names_hash_bucket_size, удалив символ #. Перед выходом из текстового редактора не забудьте сохранить произведённые изменения (CNTRL X, после чего Y и Enter).

Для выявления возможных ошибок в файлах Nginx введите:

$ sudo nginx -t

Если ошибок нет, вывод команды должен быть таким:

Проверка ошибок в файлах Nginx

Следующим шагом Nginx следует перезапустить:

$ sudo systemctl restart nginx

После произведённых действий Nginx готов обслуживать новый виртуальный хост. Чтобы убедиться в этом, откройте добавленный домен в браузере. Сообщение на странице будет выглядеть как:

Подключение к домену осуществлено

Настройка Apache

В начале, необходимо проинсталлировать сервис Apache и пакет PHP-FPM:

$ sudo apt update
$ sudo apt install apache2 php-fpm

Также, понадобится модуль PHP FastCGI. Поскольку он недоступен для установки из стандартного репозитория Ubuntu, устанавливать его придётся при помощи dpkg, предварительно загрузив дистрибутив из kernel.org:

$ wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
$ sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb

Для Apache будем использовать порт 8080. Здесь необходимо настроить так, чтобы Apache при помощи mod_fastcgi поддерживал PHP-FPM. Для чего переименуйте файл ports.conf и создайте новый, указав в нём порт 8080:

$ sudo mv /etc/apache2/ports.conf /etc/apache2/ports_old.conf
$ echo "Listen 8080" | sudo tee /etc/apache2/ports.conf

Следующим шагом необходимо будет создать виртуальный хост на Apache. Для чего отключите дефолтный хост, создайте новый и откройте файл, в котором нужно изменить конфигурацию созданного хоста:

$ sudo a2dissite 000-default
$ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf
$ sudo nano /etc/apache2/sites-available/001-default.conf

В этом файле измените значение порта на 8080 в строке <VirtualHost>:

Файл конфигурации хоста

Закройте отредактированный файл с сохранением изменений, активируйте его и перезапустите сервис Apache:

$ sudo a2ensite 001-default
$ sudo systemctl reload apache2

И в завершение настройки, установите модуль net-tools и посмотрите, действительно ли на Apache доступен для прослушивания порт под номером 8080:

$ sudo apt install net-tools
$ sudo netstat -tlpn
Прослушивание портов пакетом net-tools

Оцените статью
Хостинги