Apache2 虚拟主机错误

Posted

技术标签:

【中文标题】Apache2 虚拟主机错误【英文标题】:Apache2 VirtualHost Error 【发布时间】:2019-01-01 14:44:37 【问题描述】:

我有这个带有节点应用程序的服务器,它运行良好。从晚上到白天它停止工作,现在我试图解决这个问题。

我使用 apache2 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.log("SERVER STARTED");
);

会发生什么:

我收到错误“EADDRINUSE”。

我使用的是端口“8080”。 所以我搜索了错误“EADDRINUSE”并尝试将端口更改为3000。

我使用 FileZilla 来更新服务器中的文件。 我用 app.listen(3000) 添加了新的 app.js 文件并更新了 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

我尝试运行与 pm2 分离的 node app.js 并收到此错误:

error listen EADDRINUSE :::3000

我用了killall node,但是它说没有node进程。

于是我重启了***:

重新启动 *** 后,我再次使用 node app.js,它运行良好。 然后我使用了 pm2 start app.js,它也运行得很好。但是没有VirtualHost我仍然无法访问该网站

所以我启动了 apache/VirtualHost,问题又开始了。

问题出在 VirtualHost 代码上?我该如何解决这个问题?

【问题讨论】:

你在linux上吗?您是否可以访问正在运行它的盒子上的命令行?我知道您正在使用 Filezilla 来更新文件。如果您有访问权限,请尝试运行netstat -tulpn | grep 3000 以查看正在侦听该端口(3000)的程序。很可能 pm2 在同一个盒子上运行您的节点应用程序的多个实例,第一个实例绑定到 3000,第二个实例获取 EADDRINUSE。当然,由于这以前有效,因此可能并非如此。你能确认 pm2 确实有效吗?最近有一个更新破坏了一些东西。 关于pm2最近因为pidusage而崩溃的问题的链接:github.com/Unitech/pm2/issues/3827 @Morfie 你好,使用了netstat -tulpn | grep 3000 命令,它显示了一个在端口 3000 上运行的 app.js 实例。我从 pm2 中删除了 app.js 实例,现在我可以运行 node app.js。所以问题确实出在pm2上。关于如何修复 pm2 的任何想法?或者用其他东西代替pm2?谢谢 你运行的是什么版本的 pm2?我使用的是 3.0.1,但遇到了问题。我降级到 2.10.4,它解决了我的所有问题。 他们刚刚(2 秒前)将 PM2 更新为 3.0.2。您也可以尝试一下,因为该更新专门用于解决此问题。 【参考方案1】:

主要问题是 pm2 坏了。库的依赖项之一(pidusage)破坏了 pm2。 (参考:https://github.com/Unitech/pm2/issues/3827) 这已在 pm2 (3.0.2) 的下一个版本中得到修复。

这在很多项目中造成了很多问题,因为 pm2 被广泛使用。

【讨论】:

以上是关于Apache2 虚拟主机错误的主要内容,如果未能解决你的问题,请参考以下文章

Apache2 错误:通过 SNI 和 HTTP 提供的主机名不匹配

当我在我的本地主机系统上安装 apache2 时,它显示了这个错误(Ubuntu 17.10)

解决Apache虚拟主机报错问题apache AH01630: client denied by server configuration错误解决方法

本地主机/phpmyadmin 404 错误

代理错误 502,在 apache2 服务器上运行节点 js 应用程序

apache2 虚拟主机配置