<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>nginx - ConsultApp.ru</title>
	<atom:link href="https://consultapp.ru/tag/nginx/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>Веб-разработка, сопровождение информационных систем</description>
	<lastBuildDate>Fri, 03 Nov 2023 10:39:55 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>
	<item>
		<title>Запускаем Next.js приложение через PM2 на Nginx в простейшей конфигурации</title>
		<link>https://consultapp.ru/simple-start-next-js-app-with-pm2-on-nginx/</link>
		
		<dc:creator><![CDATA[Дмитрий]]></dc:creator>
		<pubDate>Tue, 20 Jul 2021 10:26:42 +0000</pubDate>
				<category><![CDATA[Next.js]]></category>
		<category><![CDATA[React JS]]></category>
		<category><![CDATA[Статьи]]></category>
		<category><![CDATA[next.js]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[pm2]]></category>
		<guid isPermaLink="false">https://consultapp.ru/?p=1348</guid>

					<description><![CDATA[<p>После написания нашего прекрасного веб приложения встает вопрос, как запустить его покорять мир (на рабочем сервере с доменом и прочим). Здесь нам и понадобится Nginx, тк мы хотим получить полноценный вебсервер и SSL в том числе. Для начала стоит отметить, что без SSL для тестовых запусков достаточно и npm run start на 80 порту &#8212;&#8230;</p>
<p>Сообщение <a href="https://consultapp.ru/simple-start-next-js-app-with-pm2-on-nginx/">Запускаем Next.js приложение через PM2 на Nginx в простейшей конфигурации</a> появились сначала на <a href="https://consultapp.ru">ConsultApp.ru</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>После написания нашего прекрасного веб приложения встает вопрос, как запустить его покорять мир (на рабочем сервере с доменом и прочим). Здесь нам и понадобится  Nginx, тк мы хотим получить полноценный вебсервер и SSL в том числе.</p>



<span id="more-1348"></span>



<p>Для начала стоит отметить, что без SSL для тестовых запусков достаточно и <strong>npm run start</strong> на 80 порту &#8212; все заработает из коробки, ну почти, если домен напрямую прокинут на айпишники и в нашем распоряжении целый отдельный сервер.</p>



<h2 class="wp-block-heading">Схема работы</h2>



<p>Наша схема работы будет выглядеть максимально просто:</p>



<ol class="wp-block-list">
<li>Nginx  висит, как и подобает вебсерверу, на 80 и 443 портах, обеспечивая маршрутизацию и SSL;</li>



<li>Запросы мы проксируем на localhost с нужным портом, например 3000, тк он у нас по дефолту Next.</li>
</ol>



<h2 class="wp-block-heading">Nginx</h2>



<p>Для простоты мы будем править напрямую основной конфигурационный файл<strong>  /etc/nginx/nginx.conf</strong>, как Вы понимаете на рабочем проекте так делать не надо &#8212; разберитесь с &nbsp;папками /etc/nginx/sites-available/ и /etc/nginx/sites-enabled.</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">nano /etc/nginx/nginx.conf</code></pre>



<p>Как установить Nginx , подробно описано на <a href="https://www.nginx.com/resources/wiki/start/topics/tutorials/install/" target="_blank" rel="noreferrer noopener nofollow">официальном сайте</a>, все зависит от Вашей операционной системы очевидно.</p>



<p>Итак, наши настройки для сервера (выжимка), естественно *_INSERT_IP_ADRESS_* надо заменить на Ваш ip сервера и our_best_site на Ваш домен и всю структуру папок проверить (/home/our_best_site/public_html и тд):</p>



<pre class="wp-block-code"><code lang="nginx" class="language-nginx">server {
                server_name our_best_site.ru www.our_best_site.ru;
                listen *_INSERT_IP_ADRESS_*;
                root /home/our_best_site/public_html;
                index index.php index.htm index.html;
                access_log /var/log/virtualmin/our_best_site.ru_access_log;
                error_log /var/log/virtualmin/our_best_site.ru_error_log;
                fastcgi_param GATEWAY_INTERFACE CGI/1.1;
                fastcgi_param SERVER_SOFTWARE nginx;
                fastcgi_param QUERY_STRING $query_string;
                fastcgi_param REQUEST_METHOD $request_method;
                fastcgi_param CONTENT_TYPE $content_type;
                fastcgi_param CONTENT_LENGTH $content_length;
                fastcgi_param SCRIPT_FILENAME /home/our_best_site/public_html$fastcgi_script_name;
                fastcgi_param SCRIPT_NAME $fastcgi_script_name;
                fastcgi_param REQUEST_URI $request_uri;
                fastcgi_param DOCUMENT_URI $document_uri;
                fastcgi_param DOCUMENT_ROOT /home/our_best_site/public_html;
                fastcgi_param SERVER_PROTOCOL $server_protocol;
                fastcgi_param REMOTE_ADDR $remote_addr;
                fastcgi_param REMOTE_PORT $remote_port;
                fastcgi_param SERVER_ADDR $server_addr;
                fastcgi_param SERVER_PORT $server_port;
                fastcgi_param SERVER_NAME $server_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
                fastcgi_param HTTPS $https;

               <strong> location / {
                        proxy_pass http://localhost:3000/;
                }</strong>

                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                listen *_INSERT_IP_ADRESS_*:443 ssl;
                <strong>ssl_certificate /home/our_best_site/ssl.combined;
                ssl_certificate_key /home/our_best_site/ssl.key;</strong>
        }</code></pre>



<p>У Nginx куча настроек и улучшать можно постоянно, но основная магия в паре строк, те мы проксируем все запросы на &#171;/&#187; на наш node сервер, который мы скоро запустим:</p>



<pre class="wp-block-code"><code lang="nginx" class="language-nginx">location / {<br>proxy_pass http://localhost:3000/;<br>}</code></pre>



<p>Для работы SSL, нам надо получить сертификаты в сертификационном центре и указать пути к этим файлам:</p>



<pre class="wp-block-code"><code lang="nginx" class="language-nginx">ssl_certificate /home/our_best_site/ssl.combined;
ssl_certificate_key /home/our_best_site/ssl.key;</code></pre>



<h2 class="wp-block-heading">Запускаем приложение</h2>



<h3 class="wp-block-heading">Какие файлы нам нужны от Next.js для запуска?</h3>



<p>Для начала нам нужно запустить в терминале компиляцию проекта <strong>npm run build</strong>, в итоге мы увидим что-то похожее. Next создаст все необходимые файлы, статические и для рендеринга на сервере.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><a href="https://consultapp.ru/wp-content/uploads/2021/07/image.png"><img fetchpriority="high" decoding="async" width="626" height="318" src="https://consultapp.ru/wp-content/uploads/2021/07/image.png" alt="" class="wp-image-1352" srcset="https://consultapp.ru/wp-content/uploads/2021/07/image.png 626w, https://consultapp.ru/wp-content/uploads/2021/07/image-300x152.png 300w" sizes="(max-width: 626px) 100vw, 626px" /></a></figure></div>


<p>Осталось понять, что же нам нужно перенести на рабочий сервер в простейшем варианте, без Git и прочих полезных вещей. </p>



<p>Мы идем на сервер, создаем рабочую папку для Next и копируем туда файлы и папки:</p>



<ol class="wp-block-list">
<li><strong>/.next</strong> &#8212; основная рабочая папка;</li>



<li><strong>/public</strong>  &#8212; папка со статическими публичными файлами, например favicon.ico и robots.txt;</li>



<li><strong>next.config.js</strong> &#8212; конфигурационный файл next, куда надо не забыть включить домены для картинок и например webpack5: true;</li>



<li><strong>package.json</strong> &#8212; конфигурационный файл приложения.</li>
</ol>



<p>Далее осталось запустить в этой папке <strong>npm install</strong>, при этом менеджер проанализирует package.json и автоматически сгенерирует папку <strong>/node_modules</strong>, со всеми необходимыми пакетами. Ее не надо копировать из среды разработки.</p>



<p>Все, теперь достаточно запустить <strong>npm run start</strong> или любой нужный скрипт из package.json и, если Вы правильно указали порт, а у нас Nginx проксирует на 3000, все заработает. Но, это неудобно, тк стоит закрыть терминал &#8212; все умрет. Эту проблемы нам поможет решить отличный менеджер процессов PM2.</p>



<h3 class="wp-block-heading">Запускаем Nextjs через PM2 (менеджер процессов)</h3>



<p>Подробно прочитать про этот менеджер процессов можно в мануале на <a href="https://pm2.keymetrics.io/" target="_blank" rel="noreferrer noopener nofollow">официальном сайте</a>, мы же укажем только необходимый минимум</p>



<p>Итак, устанавливаем pm2 командой (возможно Вам потребуется использовать <strong>sudo</strong>):</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">npm install pm2 -g</code></pre>



<h4 class="wp-block-heading">Запуск процессов</h4>



<p>Для запуска проекта в простом варианте можно использовать что-то вроде, при этом не забудьте перейти в рабочую папку проекта nextjs.</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">pm2 start npm -- start</code></pre>



<p>А так же полезные ключи:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash"># Указываем имя запущенного приложения
--name &lt;app_name&gt;

# Устанавливаем наблюдение за файлами проекта и перезапускаем приложение при их изменении
--watch

# Устанавливаем лимит памяти до перезагрузки приложения
--max-memory-restart &lt;200MB&gt;

# Определяем путь к файлу логов
--log &lt;log_path&gt;

# Прокидываем аргументы в скрипт
-- arg1 arg2 arg3

# Задержка между автоматическими перезапусками
--restart-delay &lt;delay in ms&gt;

# Добавлять префикс времени в логах
--time

# Не перезапускать автоматически приложение
--no-autorestart

# Определяем задачу крон для принудительного перезапуска (<code>forced</code> restart)
--cron &lt;cron_pattern&gt;</code></pre>



<h4 class="wp-block-heading">Управление и мониторинг процессов</h4>



<p>Для управления запущенными процессами можно использовать команды:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">$ pm2 restart app_name
$ pm2 reload app_name
$ pm2 stop app_name
$ pm2 delete app_name</code></pre>



<p>Вместо app_name можно использовать:</p>



<ul class="wp-block-list">
<li><code><strong>all</strong></code>&nbsp;для управления всеми процессами;</li>



<li><code><strong>id</strong></code>&nbsp;для управления процессом по его id.</li>
</ul>



<p>Мониторить запущенные процессы можно парой удобных команд:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">// онлайн мониторинг в экране терминала
$ pm2 monit

// список процессов
# pm2 list</code></pre>



<p>Пример вывода для <strong>pm2 monit</strong>:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><a href="https://consultapp.ru/wp-content/uploads/2021/07/image-2.png"><img decoding="async" width="585" height="374" src="https://consultapp.ru/wp-content/uploads/2021/07/image-2.png" alt="Команда pm2 monit" class="wp-image-1359" srcset="https://consultapp.ru/wp-content/uploads/2021/07/image-2.png 585w, https://consultapp.ru/wp-content/uploads/2021/07/image-2-300x192.png 300w" sizes="(max-width: 585px) 100vw, 585px" /></a></figure></div>


<h4 class="wp-block-heading">Итого по pm2</h4>



<p>Теперь мы можем запустить наш проект, со всеми ключами. Представим, что наше приложение лежит в папке <strong>/home/our_best_site/public_html/nextjs</strong>:</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">$ cd /home/our_best_site/public_html/nextjs
$ pm2 start npm --watch --ignore-watch="node_modules" --restart-delay=10000 --name "app_name1" -- start</code></pre>



<p>Из строки видно, что запускаем мы в рабочей папке наш процесс <strong>npm start</strong> с именем <strong>app_name1</strong>, при этом следим за изменениями с задержкой перезапуска <strong>10000мс</strong> и игнорируем папку <strong>node_modules</strong>. </p>



<p>При этом в терминале мы увидим наше приложение:</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><a href="https://consultapp.ru/wp-content/uploads/2021/07/image-1.png"><img decoding="async" width="558" height="68" src="https://consultapp.ru/wp-content/uploads/2021/07/image-1.png" alt="Команда pm2 start npm  --name &quot;app_name1&quot; -- start" class="wp-image-1358" srcset="https://consultapp.ru/wp-content/uploads/2021/07/image-1.png 558w, https://consultapp.ru/wp-content/uploads/2021/07/image-1-300x37.png 300w" sizes="(max-width: 558px) 100vw, 558px" /></a></figure></div>


<h2 class="wp-block-heading">Заключение</h2>



<p>В результате мы получаем nextjs приложение, которое работает на 3000 порту и все запросы (80 и 443 портов) в него проксируются через nginx. Управление приложением происходит через менеджер <strong>pm2</strong>.  Стоит отметить, что все написанное будет работать и для React.js приложения с минимальными правками. </p>



<p>Ура, все работает)</p>
<p>Сообщение <a href="https://consultapp.ru/simple-start-next-js-app-with-pm2-on-nginx/">Запускаем Next.js приложение через PM2 на Nginx в простейшей конфигурации</a> появились сначала на <a href="https://consultapp.ru">ConsultApp.ru</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
