我在同一臺服務器上運行 Node 和 Apache,其中 node 是后端服務器,由 Axios 請求從前端收集用戶資料。
我使用 Apache 請求 SSL 證書certbot并成功。我正在嘗試部署節點后端以訪問我的endpointie (website.com/endpoint)。
我能夠看到index.html位于網站檔案夾中的 test 。當我嘗試時,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>
這是我config的 Apache 虛擬主機檔案
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;
uj5u.com熱心網友回復:
答案是保護節點后端服務器,以便用戶留在安全HTTPS地址上。您可以通過將SSL密鑰分配給節點服務器來完成此操作。然后編輯 app.js 檔案以連接到HTTPS,而不是HTTP. 以上僅app.js連接到HTTP。所以這需要修復。最后,將Apache虛擬主機中的反向代理編輯為 fwd HTTPto HTTPS。
就我而言,前端通過來自 let's encrypt (certbot) ie 的 HTTPS SSL 證書是安全的https://website.com,但后端不安全,所以當我嘗試去時https://websote/endpoint出現錯誤,因為服務器不安全。這是因為后端app.js檔案在需要連接到 HTTPS 時連接到了 HTTP 服務器。
注意:如果您有一個安全的網站/應用程式,并且您向一個非安全的 HTTP 地址發出 Axios 請求,那么您將收到一條cors錯誤訊息,指出您需要將 HTTP 更改為 HTTPS。您可以通過使 node.js 服務器安全來實作此目的。
這是細分:
1. 將SSL證書從 Apache 服務器復制到 Node 服務器目錄。在節點檔案夾中創建一個單獨的目錄來保存證書。為該檔案夾分配權限規則。
-注意:當您提供或Node檔案夾中SSL 證書目錄的位置路徑時,將無法看到它們,這就是您需要分配權限的原因。app.jsserver.jsNode
制作證書目錄:(替換下面的directory_name) sudo mkdir directory_name
復制:(替換下面的your_website_folder)
sudo cp etc/letsencrypt/live/your_webiste_folder/privkey.pem /var/www/cert
sudo cp /etc/letsencrypt/live/your_website_folder/fullchain.pem /var/www/cert
幫助:https : //www.linuxscrew.com/linux-cp-comman
2.編輯app.js或server.js連接到HTTPS服務器,而不是HTTP
//imports
......
//use node over secure server
const https = require("https"),
fs = require("fs");
const sslServer = https.createServer (
{
key: fs.readFileSync('/var/path_to_privkey.pem'),
cert: fs.readFileSync('/var/path_to_fullchain.pem'),
},
app <---MAKE SURE TO PASS APP IN
)
......
......
sslServer.listen(3001, () => {
console.log(`Express running PORT ${server.address().port}`
});
- 分配防火墻權限規則以允許
port您從app.js檔案中使用,即3001通過命令允許ufw。
-注意:如果您嘗試連接到port并且超時,那么您的 apache 防火墻設定不允許該埠通過,這就是您需要編輯 apache 防火墻權限的原因 - 編輯
000-default.conf,website.com.conf和website.com-le-ssl檔案從HTTP到HTTPS FWD。-注意:website.com.conf由certbotfrom生成letsencrypt
注意:這是一個很長的答案,如果它還沒有完成,請回來查看
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/327298.html
上一篇:如何使用混合分隔符(即方括號、空格和雙引號)來決議日志(nginx/apacheaccess.log)?并可選擇轉換為json
下一篇:命令來列印目錄中像素大小的影像。
