【发布时间】:2021-10-12 05:41:47
【问题描述】:
我在同一台服务器上运行 Node 和 Apache,其中 node 是后端服务器,由 Axios 请求从前端收集用户数据。
我使用 Apache 通过certbot 请求 SSL 证书,并且成功了。我正在尝试部署节点后端以访问我的endpoint 即(website.com/endpoint)。
我可以看到位于网站文件夹中的测试index.html。当我尝试aws.website.com/endpoint 时,我得到了服务器超时和 404 not found 错误。
我的应用在 Linux 服务器中的位置是var/www/website.com,而不是默认的var/www/html 路径。
我的问题:如何在同一台服务器上运行 node 和 apache 以允许用户通过 https 访问应用程序?
***更新:在我的情况下,您需要节点应用程序在单独的端口上运行 3001,而 Apache 需要在单独的端口上运行,即 80,并通过 mod-proxy 使用反向代理。
这是000-default.conf 文件:
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://18.191.235.31/
ProxyPassReverse / http://18.191.235.31/
ServerName aws.website.com
ServerAdmin example@localhost
DocumentRoot /var/www/aws.backend-dg.com
</VirtualHost>
这是我用于 Apache 虚拟主机的 config 文件:
website/com.conf:
<VirtualHost *:80> ServerName aws.website.com ... DocumentRoot /var/www/aws.website.com ... RewriteEngine on RewriteCond %{SERVER_NAME} =aws.website.com RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost>
这是我的“website.com.le-ssl.conf”(由 certbot 手动生成)`
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName aws.website.com
....
DocumentRoot /var/www/aws.website.com
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile /etc/letsencrypt/live/website/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/website/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
这是我的default-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
DocumentRoot /var/www/aws.backend-dg.com
....
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
....
SSLEngine on
....
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
....
</VirtualHost>
</IfModule>
App.js 文件
const cors = require("cors");
const mongoose = require("mongoose");
const express = require("express");
const logger = require("morgan");
const app = express();
require("./models/Email");
const routes = require("./routes/routes");
app.use(cors());
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "DELETE, PUT, GET, POST");
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept"
);
next();
});
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// Express only serves static assets in production
if (process.env.NODE_ENV === "production") {
app.use(express.static("client/build"));
}
app.get('*',(req, res) => {
res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
});
app.use(express.json());
app.use(logger("dev"));
app.use("/", routes);
app.use("/search", express.static("search"));
const mongoURI =
"mongodb+srv://somename@cluster................";
const conn = mongoose.createConnection(mongoURI);
mongoose.connect(
mongoURI,
{ useNewUrlParser: true },
{ useUnifiedTopology: true }
);
conn.once("open", () => {
console.log("Connection Successful");
});
conn.on("error", console.error.bind(console, "MongoDB connection error:"));
const server = app.listen(3001, () => {
console.log(`Express running PORT ${server.address().port}`);
});
const express = require("express");
const router = express.Router();
const emailController = require('../controllers/EmailController');
router.get('/', emailController.baseRoute);
router.post('back/get-email', emailController.createEmail);
module.exports = router;
【问题讨论】:
-
你能分享你的 apache ssl conf 吗?它应该对端口 443 进行一些绑定...
-
因此,您的 express 应用程序应该在某个端口(例如 5005)上运行,并且您的 apache ssl.conf 中应该有一个 proxy_pass 命令...
-
@KemalKaplan 我刚刚用所有配置文件更新了我的问题。关于我的快递服务器,这就是我的问题所在,由于我的域上的 SSL 证书,我不能使用 443 以外的任何其他端口来收听。我尝试了不同的端口,即:444、3000、0 等,每次我尝试使快速服务器保持连接并且握手断开时,错误是该网站不安全:例如 https:aws.website .com:5000 让我出错,网站不安全
-
@KemalKaplan 如何在 SSL conf 中编写 prox cmd?
标签: node.js apache express deployment