У меня есть этот сервер с приложением узла, и он отлично работал. С ночи до дня он перестал работать, и теперь я пытаюсь это исправить.
Я использую apache2 VirtualHost для запуска этого сервера
Код VirtualHost:
<VirtualHost *:80 *:443>
ServerName website.com
ServerAlias www.website.com
DocumentRoot /var/www/project
<Directory /var/www/project>
Options -Indexes +FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ProxyRequests Off
ProxyPreserveHost On
ProxyVia Full
<Proxy *>
Require all granted
</Proxy>
<Location />
ProxyPass http://127.0.0.1:3000/
ProxyPassReverse http://1127.0.0.1:3000/
</Location>
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.website.com [OR]
RewriteCond %{SERVER_NAME} =website.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
Мой файл app.js:
var express = require("express");
var app = express();
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
var bodyparser = require("body-parser"),
mongoose = require("mongoose"),
passport = require("passport"),
LocalStrategy = require("passport-local"),
FacebookStrategy = require('passport-facebook').Strategy,
TwitterStrategy = require('passport-twitter').Strategy,
GoogleStrategy = require('passport-google-oauth').OAuth2Strategy,
expressSanitizer = require('express-sanitizer'),
methodOverride = require("method-override"),
flash = require('connect-flash'),
authData = require('./auth.js'),
sm = require('sitemap'),
fs = require('fs');
var User = require("./models/user");
mongoose.connect("databaselink");
app.use(bodyparser.json());
app.use(bodyparser.urlencoded({extended: true}));
app.use(expressSanitizer());
app.set("view engine", "ejs");
app.use(express.static(__dirname + "/public"));
app.use(methodOverride("_method"));
app.use(flash());
// PASSPORT CONFIGURATION
app.use(session({
cookie : {
maxAge : 7 * 24 * 60 * 60 * 1000
},
secret: "Bloom blaaaaa bliiiuuuummmmmmm",
saveUninitialized: false, // don't create session until something stored
resave: false, //don't save session if unmodified
store: new MongoStore({
mongooseConnection: mongoose.connection,
autoRemove: 'native', // Default
touchAfter: 24 * 3600 // time period in seconds
})
}));
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(User.authenticate()));
// used to serialize the user
passport.serializeUser(function(user, done) {
done(null, user.id);
});
// used to deserialize the user
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
// LISTEN
app.listen("3000", function(){
console.info("SERVER STARTED");
});
Что происходит:
Я получал ошибку «EADDRINUSE».
Я использовал порт 8080. Итак, я поискал ошибку «EADDRINUSE» и попытался изменить порт на 3000.
Я использовал FileZilla для обновления файлов на сервере. Я добавил новый файл app.js с app.listen (3000) и обновил код VirtualHost.
Затем я перезапустил сервер apache, а также pm2 (я использую pm2, чтобы мои серверы узлов оставались в сети).
Но когда я пытаюсь перейти на свой сайт, я получаю следующую ошибку:
Service Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
Apache/2.4.7 (Ubuntu) Server at www.website.com Port 80
Я попытался запустить node app.js отдельно от pm2 и получил эту ошибку:
error listen EADDRINUSE :::3000
Я использовал узел killall, но он говорит, что процесса узла нет.
Итак, я перезапустил VPN:
После перезапуска VPN я снова использовал node app.js, и он работал очень хорошо. Затем я использовал pm2 start app.js, и он тоже работал очень хорошо. Но я все еще не могу получить доступ к веб-сайту без VirtualHost
Итак, я запускаю apache / VirtualHost, и проблемы начинаются снова.
Проблема в коде VirtualHost? Как я могу это исправить?
Ссылка на вопрос о том, что pm2 недавно сломался из-за pidusage: github.com/Unitech/pm2/issues/3827
@Morfie Привет, использовал команду netstat -tulpn | grep 3000, и он показал один экземпляр app.js, работающий на порту 3000. Я удалил приложение app.js из pm2, и теперь я могу запустить узел app.js. Так что проблема действительно в pm2. Есть идеи, как я могу исправить pm2? Или что-то другое использовать вместо pm2? Спасибо
Какую версию pm2 вы используете? Я использовал 3.0.1, и у меня возникли проблемы. Я понизил версию до 2.10.4, и все мои проблемы были устранены.
Они только (2 секунды назад) обновили PM2 до 3.0.2. Вы также можете попробовать это, поскольку это обновление было специально для решения этой проблемы.
@Morfie Только что установил PM2 3.0.2, запустите netstat -tulpn | grep 3000 и его единственный экземпляр app.js. Я перезапустил apache2, но теперь, когда я захожу на сайт, у меня появляется эта ошибка The proxy server received an invalid response from an upstream server. The proxy server could not handle the request GET /index. Reason: Error reading from remote server Apache/2.4.7 (Ubuntu) Server at www.listsroll.com Port 80
@Morfie Я помню, что у меня уже была эта ошибка, когда я настраивал веб-сайт, я считаю, что проблема в коде VirtualHost?
@Morfie Привет, сайт сейчас работает, у меня проблема только с mongoDB, но я могу это исправить, большое спасибо за помощь :)
Это был PM2 или что-то еще?
@Morfie Я обновил PM2, и теперь он работает, проблема, с которой я столкнулся после обновления PM2, была с mongoDB. Теперь все нормально;)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Основная проблема заключалась в том, что pm2 ломался. Одна из зависимостей библиотеки (pidusage) сломала pm2. (Ссылка: https://github.com/Unitech/pm2/issues/3827) Это было исправлено в следующей версии pm2 (3.0.2).
Это вызвало множество проблем во многих проектах, так как pm2 широко используется.
Вы используете Linux? У вас есть доступ к командной строке на компьютере, на котором вы это используете? Я знаю, что вы используете Filezilla для обновления файлов. Если у вас есть доступ, попробуйте запустить
netstat -tulpn | grep 3000, чтобы узнать, какая программа прослушивает этот порт (3000). Вполне может быть, что pm2 запускает несколько экземпляров вашего приложения узла в одном и том же блоке, и первый экземпляр привязывается к 3000, а второй получает EADDRINUSE. Конечно, поскольку это работало раньше, это могло быть не так. Можете ли вы подтвердить, что pm2 действительно работает? Было недавнее обновление, которое сломало ситуацию.