Лайфхаки

Маленькие, полезные хитрости

Сам себе devops или настраиваем Nginx прокси для.. Ошибка №1: Недостаточное количество файловых дескрипторов на воркера

23.07.2022 в 14:34

Сам себе devops или настраиваем Nginx прокси для.. Ошибка №1: Недостаточное количество файловых дескрипторов на воркера


Директивазадает максимальное количество одновременных подключений, которое может быть открыто для рабочего процесса NGINX (значение по умолчанию 512). Здесь учитываются не только клиентские, но и все типы подключений (например, соединения с прокси-серверами). Важно помнить, что существует еще одно ограничение на количество одновременных подключений, которые могут быть открыты воркером: ограничение операционной системы на максимальное количество файловых дескрипторов (FDS), выделенных для каждого процесса. В современных дистрибутивах UNIX ограничение по умолчанию равно 1024.

Для всех развертываний NGINX, кроме самых маленьких, ограничение в 512 подключений на воркера может быть недостаточным. На самом же деле, дефолтный файл nginx.conf , который мы распространяем с двоичными файлами NGINX с открытым исходным кодом и NGINX Plus, увеличивает это значение до 1024.

Распространенной ошибкой при конфигурации является неувеличение количества FDs как минимум вдвое по сравнению со значением worker_connections . Исправить ситуацию можно, установив это значение с помощью директивыв основном контексте конфигурации.

Больше FD требуется по следующей причине: каждое соединение рабочего процесса NGINX с клиентом или вышестоящим сервером потребляет файловый дескриптор. Когда NGINX действует как веб-сервер, требуется один FD для соединения и один FD непосредственно для каждого обслуживаемого файла, то есть минимум два FD на клиента (стоит отметить, что большинство веб-страниц создаются из множества файлов). Когда NGINX используется в качестве прокси-сервера, требуется по одному дескриптору для подключения к клиенту и вышестоящему серверу и, возможно, третий FD для файла, используемого для временного хранения ответа сервера. NGINX может функционировать как веб-сервер для кэшированных ответов и как прокси-сервер, если кэш пуст или истек.

NGINX также использует FD на каждый файл журнала и пару FD для связи с мастер-процессом, но обычно эти цифры невелики по сравнению с количеством файловых дескрипторов, используемых для подключений и файлов.

UNIX предлагает несколько способов задать необходимое количество FDs для каждого процесса:

  • Команда ulimit , если вы запускаете NGINX из shell;
  • Переменные манифеста init script или systemd если вы запускаете NGINX как сервис;
  • Файл /etc/security/limits.conf .

Стоит отметить, что данный метод зависит от того, как вы запускаете NGINX, тогда как worker_rlimit_nofile работает независимо от этого.

Плюс ко всему, с помощью команды операционной системы sysctl fs.file-max вы можете установить общесистемное ограничение на количество FDs. Общего объема должно хватить, но стоит проверить, что максимальное количество файловых дескрипторов, задействованных в рабочих процессах NGINX (* worker_rlimit_nofile worker_connections ), значительно ниже, чем fs.file‑max**. В случае если вдруг NGINX станет использовать все доступные ресурсы (например, во время DoS-атаки), даже возможность выполнить вход в систему для устранения проблем станет невозможна.

Nginx and Tomcat. Apache Tomcat Vs Nginx Comparison

Apache Tomcat and Nginx server, were created for two different tasks. NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as an IMAP/POP3 proxy server and Apache Tomcat is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies. The Java Servlet, JavaServer Pages.

Want to master Tomcat Server ?

Subscribe to our newsletter and download the Apache Tomcat Cookbook right now!

In order to get you prepared for your Tomcat development needs, we have compiled numerous recipes to help you kick-start your projects. Besides reading them online you may download the eBook in PDF format!

Thank you!

We will contact you soon.

1. The tools

  • Apache Tomcat 8
  • Nginx server 1.10.2

2. Introduction

In this article We are going to compare Tomcat and Nginx servers and we are going to see where it is better to use one instead of the other.

3. Prerequisites

  • Tomcat 8 installed and running

4. Nginx server

Nginx server is a web server, which used to serve static content like HTTP pages and serve dynamic content using FastCGI or as a reverse proxy.Nginx server is a high-performance HTTP server and reverse proxy, ideal to use as a front end of another web servers. It is possible to use Nginx as a very efficient HTTP load balancer to distribute traffic to several application servers and to improve performance, scalability and reliability of web applications with Nginx.Nginx can be deployed to serve dynamic HTTP content on the network using FastCGI, SCGI handlers for scripts, WSGI application servers or Phusion Passenger modules, and it can serve as a software load balancer. Nginx uses an asynchronous event-driven approach to handling requests. Nginx modular event-driven architecture can provide more predictable performance under high loads.

4.1 Nginx request/response

Static content is meant to use a request/response scheme that is a message exchange pattern. The client makes a request to the server and the server sends a response.

In the case of the Nginx server it’s main purpose is to serve static HTML files that are text files formated with the HTML markup language. Other static content could be served as well, like XML, JSON, images, video files, sound files, etc. Also Nginx server could be used as a reverse proxy and a load balancer to serve as a frontend of other servers.

4.2 Download Nginx

Go to the URLand download the Nginx server for Windows.

1 Download Nginx

4.3 Install Nginx

Nginx comes in a zip compressed folder, all you need to do is uncompress the folder on your hard disk and you have a working Nginx on windows. Choose a folder and unzip Nginx.

2 Install Nginx

4.4 Nginx serve a simple HTML file

Let’s create a simple HTML file to show the static content.

HTML static content

This is the title

This is static content

Nginx serve its static documents from thehtmldirectory.

Save the HTML file asexample.htmland copy the file in thehtmldirectory.

3 Nginx document root

4.5 Start Nginx

Open a terminal window and typestart nginx

4 Start Nginx

Now open the browser to see the static content. Go to the URIand you see the following page.

4 Static content

The browser, in this case Firefox, makes a request to the Nginx server and then the server as a response sends the page we created before.

4.6 Stop Nginx

To stop the nginx server typenginx -s stop

5 Stop Nginx

5. Tomcat server

Tomcat server is a servlet container, which is designed to serve Java servlets. Tomcat is a server that is meant to run applications that were written in Java.The servlets are Java classes that are used to serve dynamic web content. You can use Tomcat to serve static content as well. Recent versions of Tomcat have an improved performance to serve static content.

5.1 Example servlet

5.1.1 Create the project

We are going to create an example servlet to see how this works.

Nginx java. Load Balancing Apache Tomcat Servers with NGINX Open Source and NGINX Plus

Load balance Apache Tomcat application servers with NGINX Open Source or the advanced features in NGINX Plus, following our step-by-step setup instructions.

This deployment guide explains how to use NGINX Open Source and NGINX Plus to load balance HTTP and HTTPS traffic across a pool of Apache TomcatTMapplication servers. The detailed instructions in this guide apply to both cloud‑based and on‑premises deployments of Tomcat.

About NGINX Open Source and NGINX Plus

NGINX Open Source is an open source web server and reverse proxy that has grown in popularity in recent years because of its scalability, outstanding performance, and small footprint. NGINX Open Source was first created to solve the C10K problem (serving 10,000 simultaneous connections on a single web server). NGINX Open Source’s features and performance have made it a staple of high‑performance sites – it’s the #1 web server at the 100,000 busiest websites in the world .

NGINX Plus is the commercially supported version of NGINX Open Source . NGINX Plus is a complete application delivery platform, extending the power of NGINX Open Source with a host of enterprise‑ready capabilities that enhance a Tomcat deployment and are instrumental to building web applications at scale:

  • Full‑featured HTTP, TCP, and UDP load balancing
  • High‑performance reverse proxy
  • Caching and offload of dynamic and static content
  • Adaptive streaming to deliver audio and video to any device
  • and high availability
  • Advanced activity monitoring available via a dashboard or API
  • About Apache Tomcat

    Apache Tomcat is an open source software implementation of the Java Servlet, JavaServer Pages, Java Expression Language, and Java WebSocket technologies.

    We tested the procedures in this guide against Apache Tomcat 8.0.

    Prerequisites and System Requirements

    • A Tomcat application server installed and configured on a physical or virtual system.
    • A Linux system to host NGINX Open Source or NGINX Plus. To avoid potential conflicts with other applications, we recommend you install the software on a fresh physical or virtual system. For the list of operating systems supported by NGINX Plus, see NGINX Plus Technical Specifications .
    • NGINX Open Source 1.9.5 and later, and NGINX Plus R7 and later.

    The instructions assume you have basic Linux system administration skills, including the following. Full instructions are not provided for these tasks.

    • Configuring and deploying a Tomcat application
    • Installing Linux software from vendor‑supplied packages
    • Editing configuration files
    • Copying files between a central administrative system and Linux servers
    • Running basic commands to start and stop services
    • Reading log files

    About Sample Values and Copying of Text

      example.comis used as a sample domain name (in key names and configuration blocks). Replace it with your organization’s name.
    • Many NGINX Open Source and NGINX Plus configuration blocks in this guide list two sample Tomcat application servers with IP addresses 10.100.100.11 and 10.100.100.12. Replace these addresses with the IP addresses of your Tomcat servers. Include a line in the configuration block for each server if you have more or fewer than two.
    • For readability reasons, some commands appear on multiple lines. If you want to copy and paste them into a terminal window, we recommend that you first copy them into a text editor, where you can substitute the object names that are appropriate for your deployment and remove any extraneous formatting characters that your browser might insert.
    • Some of the examples in this guide are partial and require additional directives or parameters to be complete. You can download complete configuration files for basic and enhanced load balancing from the NGINX website, as instructed in. For details about a specific directive or parameter, see the NGINX reference documentation .
    • We recommend that you do not copy text from the configuration snippets in this guide into your configuration files. For the recommended way to create configuration files, see.

Tomcat cluster Nginx. Setting up a Nginx+Tomcat load balancing cluster in a Linux environment

Tomcat Server is a free open source web application server, a lightweight application server, the first choice for developing and debugging JSP programs. Because Tomcat's ability to handle static HTML is not as good as Apache or Nginx, Tomcat is usually used as a servlet and JSP container, running separately on the back end.

  • The Nginx server can support up to 50,000 concurrent connection responses, has powerful static resource processing capabilities, runs stably, and consumes very low system resources such as memory and CPU.

Usually, a Tomcat site cannot be used in a production environment because of the possibility of a single point of failure and the inability to cope with too many complex requests from customers. Currently, many large websites use the Nginx server as a reverse proxy for the back-end website program. The load balancer, in simple terms, is Nginx as a load balancer. In response to the client's request, Tomcat acts as a load cluster for the application server and processes the client's request. That is, Nginx forwards the access request to the server of the backend server pool for processing. The website topology diagram is as shown:

Case environment:

Host operating system IP address main software Nginx server RedHat7.3 x86_64192.168.113.151nginx-1.12.0.tar.gzTomcat server 1CentOS7.4 x86_64192.168.113.129jdk-8u91-linux-x64.tar.gz / apache-tomcat-8.5.16.tar.gzTomcat server 2CentOS7.4 x86_64192.168.113.150jdk-8u91-linux-x64.tar.gz / apache-tomcat-8.5.16.tar.gz

  • Tomcat1 server configuration

1. Turn off the firewall after starting the host

Copy code

systemctl disable Firewalld.service //Disable the firewall service systemctl stop firewalld.service //Turn off the firewall service Copy code

2. Install JDK, configure the Java environment

(1). Unzip the jdk software to the /opt directory, and move the jdk folder generated after decompression to /usr/local/ and rename it to java.

Copy code

tar zxvf jdk-7u65-linux-x64.gz -C /opt mv jdk1.7.0_65/ /usr/ local /java Copy code

(2). Create a java.sh script under /etc/profile.d/.

Copy code

~> # vim /etc/profile.d/java.sh export JAVA_HOME=/usr/local/java //Set the Java root directory export PATH=$PATH:$JAVA_HOME/bin //Add the Java root directory to the PATH environment variable Bin/subdirectory Copy code

(3). Import the java.sh script into the environment variable to make it take effect

Copy code

source /etc/profile.d/java.sh Copy code

(4) Run the java-version command to check whether the java version is the same as the previous installation.

Copy code

~> # java -version openjdk version "1.8.0_131" OpenJDK Runtime Environment (build 1.8.0_131-b12) OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode) Copy code

3. Install and configure Tomcat

(1). Unzip the apache-tomcat-8.5.16.tar.gz package to the /opt directory, and move the folder generated after decompression to /usr/local/ and rename it to tomcat8.

Copy code

tar zxvf apache-tomcat-8.5.16.tar.gz -C /opt/ mv apache-tomcat-8.5.16/ /usr/ local /tomcat8 Copy code

(2). Start Tomcat

Copy code

~> # /usr/local/tomcat8/bin/startup.sh Using CATALINA_BASE: /usr/local/tomcat8 Using CATALINA_HOME: /usr/local/tomcat8 Using CATALINA_TMPDIR: /usr/local/tomcat8/temp Using JRE_HOME: /usr/local/java Using CLASSPATH: /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar Tomcat started. Copy code

Copy code

~> # netstat -ntap | grep 8080 tcp6 0 0 :::8080 :::* LISTEN 1583/java Copy code

(3). Open the browser access test http://192.168.113.129:8080/, if the interface below x appears, it means that Tomcat has been configured to start successfully.

4. Create a Java web site

(1). Create a web directory in the root directory and create a webapp1 directory in it to store the website files.

Copy code

~> # mkdir -pv /web/webapp1 mkdir: created directory "/web" mkdir: created directory "/web/webapp1" Copy code

(2). Create a test page for index.jsp in the webapp1 directory.

Copy code

~> # vim /web/webapp1/index.jsp //Annotation JSP Test1 page //Test page title //Test page body content

(3). Modify Tomcat's server.xml file.

Что такое Nginx для чайников. В чём ещё отличия от Apache

Документация. У Apache документации, форумов и примеров гораздо больше, потому что проект начался на 7 лет раньше и все материалы сразу были на английском — стандартном языке для всех программистов.

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

Работа с модулями. В Apache всё просто: прописал название модуля и веб-сервер сразу его подгрузил и начал использовать. Не нужно — выгрузил, тоже на ходу. Это позволяет очень гибко настраивать поведение сервера в разные моменты времени.

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

Конфигурация и настройка. Apache управляется через служебные файлы, в которые он постоянно заглядывает, например .htaccess. Это снова гибкость и возможность очень тонкой настройки поведения для каждой папки и запроса. Но Apache каждый раз тратит время на такие чтения и проверки, а когда запросов много, то это становится критично. Ещё нужно просмотреть все папки, к которым идёт запрос, а это тоже время.

Nginx работает иначе: всё хранится в одном конфигурационном файле. Этот файл отвечает за настройки всего сервера, и Nginx точно знает, где его быстро найти. Это более безопасно для работы сервера: никто не сможет положить в папку свой файл .htaccess, прописать в нём чёрт-те что и сломать работу всего сервера.

Nginx location. Использование location в Nginx

Nginx location — структура в конфигурационном файле Nginx определяющая к URl и запросам какого вида будут применяться описанные правила.

Пример location:

Директива location всегда задается внутри блока server конфигурационного файла Nginx. С location используют регулярные выражения , при этом выполняются действия заданные для блока для которого совпадение с  маской самое узкое.

Т.е. под location / будут подпадать все файлы, обрабатываемые сервером, под location ~ \.php будут подпадать только скрипты с расширением .php , опции для корня обрабатываться не будут. Ниже основные случаи будут рассмотрены подробно.


Регулярные выражения в location Nginx:

  • = строковые совпадения, если совпадение с шаблоном обнаружено дальнейшая проверка заканчивается
  • ~ тильда в начале означает, что регистр будет учитываться
  • ~* регулярные вырадения без учета регистра
  • ^~ приоритетное строковое значение, чтобы применились опции требуется совпадение начала выражения — если это каталог, то директивы текущего location будут распространяться на все файлы в нем

Принципы обработки location и директивы listen

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

server {

location {

}

}

server характеризуется адресом, портом и запрашиваемым доменным именем

Они определяются директивой listen. Если один или несколько параметров не указаны используются значения по умолчанию.

Так при отсутствующем адресе будет использован 0.0.0.0, при отсутствующем порте 80 для пользователя root, 8080 для любого другого пользователя.

Более точное явное совпадение IP адереса и порта обслуживается в первую очередь.
Если и порт и адрес заданы для двух location — идет сравнение server_name .

При отсутствии server_name, но присутствии IP адреса и порта блок всегда будет выполняться первым даже если в другом location есть server_name, совпадающий с запрашиваемым, но не указан порт или адрес.

Как работает Nginx. Как же работает NGINX?


NGINX использует модель с фиксированным числом процессов, которая наиболее эффективно задействует доступные ресурсы системы:
  • Единственный мастер-процесс выполняет операции, которые требуют повышенных прав, такие, как чтение конфигурации и открытие портов, а затем порождает небольшое число дочерних процессов (следующие три типа).
  • Загрузчик кэша запускается на старте чтобы загрузить данные кэша, расположенные на диске, в оперативную память, а затем завершается. Его работа спланирована так, чтобы не потреблять много ресурсов.
  • Кэш-менеджер просыпается периодически и удаляет объекты кэша с жесткого диска, чтобы поддерживать его объем в рамках заданного ограничения.
  • Рабочие процессы выполняют всю работу. Они обрабатывают сетевые соединения, читают данные с диска и пишут на диск, общаются с бэкенд-серверами.
Документация NGINX рекомендует в большинстве случаев настраивать число рабочих процессов равное количеству ядер процессора, что позволяет использовать системные ресурсы максимально эффективно. Вы можете задать такой режим с помощью директивыв конфигурационном файле:

worker_processes auto;

Когда NGINX находится под нагрузкой, то в основном заняты рабочие процессы. Каждый из них обрабатывает множество соединений в неблокирующемся режиме, минимизируя количество переключений контекста.Каждый рабочий процесс однопоточен и работает независимо, принимая новые соединения и обрабатывая их. Процессы взаимодействуют друг с другом используя разделяемую память для данных кэша, сессий и других общих ресурсов.