[英]How to configure Apache server and node server in one domain?
我學習有困難。
我正在制作自己的 sns 應用程序,例如 Facebook 或 Instagram。 所以我完成了時間線功能,所以這次我要創建一個聊天。 所以我想用node.js + socket.io做一個聊天功能。 這就是為什么我想知道如何構建 node.js 服務器。
我的開發環境是 Ubuntu 18.04 + apache2 + Mysql (+ Let's Encrypt SSL And I have a domain)
即使我在谷歌上搜索並查找,我也無法創建 https node.js 服務器。
有人不能輕松詳細地幫助我嗎?
android 來自 Api 29 默認推薦使用 https 通信。 您可以在 api 29 上與 http 通信,但這不是一個長期的解決方案。 這就是我使用 https 配置我的服務器的原因。 我永遠不會把它改成http。
假設域名為 test.com。
以下是我的 000-default.conf 文件中的設置。
vi /etc/apache2/sites-availabls/000-default.conf
<VirtualHost *:80>
ServerName test.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Redirect / https://test.com/
</VirtualHost>
<VirtualHost *:443>
ServerName test.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateKeyFile /etc/letsencrypt/live/test.com/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/test.com/cert.pem
SSLCACertificateFile /etc/letsencrypt/live/test.com/fullchain.pem
<Directory />
AllowOverride All
Options All -Indexes
Require all granted
</Directory>
</VirtualHost>
端口 80 稱為 http 通信。 所以我重定向到https uri。
所以我基本知道443端口是https通信的端口。 無論如何,重要的是我的Apache服務器使用的是80端口和443端口。這里我們要創建一個可以用https通信聊天的node.js socket服務器。 如果您能輕松而詳細地幫助我,那將非常有幫助。
服務器的根路徑 -> /var/www/html/
在android中使用的php文件夾路徑-> /var/www/html/android
要在 android 上使用的用戶個人資料圖片文件夾路徑 -> /var/www/html/android/image
我想在以下路徑中創建一個 node.js 文件。
用於在 android 上聊天的文件夾。 -> /var/www/html/android/chat
我在谷歌上搜索,但都失敗了。 否則,我看到的所有示例都只運行了一個 node.js 服務器。
我嘗試了 proxypass 或 proxypassreverse 或Something but Failed。
嘗試在服務器計算機上的任何空閑端口上運行服務器
var https = require('https');
https.createServer(options, app).listen(ANY_PORT);
並在您的 android 代碼中指定要連接的端口
val url = URL("https://test.com:ANY_PORT")
這對我行得通。
您可以做的一件事是使用 apache 進行反向代理。 請參閱文檔: https : //httpd.apache.org/docs/2.4/howto/reverse_proxy.html
這真正意味着說你的 php 東西在端口 80 和 443 上運行。 但是,現在你有一個節點服務在端口 3000 上運行。
但是,您想將端口 3000 屏蔽為端口 80。所以您可以說您有 domain.com/chat 運行您的端口。 因此,您可以偵聽到達該路徑的任何路由,並將它們轉發到運行該服務的應用程序。
按照說明從 certbot.eff.org 安裝 Letsencrypt 並使用此命令。 安裝時選擇No Redirect
選項。
sudo certbot --apache
使用以下命令從您的證書文件夾中復制privkey.pem
和fullchain.pem
sudo cp /etc/letsencrypt/live/test.com/privkey.pem ~/nodejs-rootfolder
sudo cp /etc/letsencrypt/live/test.com/fullchain.pem ~/nodejs-rootfolder
nodejs-rootfolder
是您保存Node.js
服務器項目的地方
在index.js
或server.js
文件中提及以下代碼。
var express = require('express');
var http = require('http');
var https = require('https');
var app = express();
app.use(cors())
app.use(bodyParser.json({ limit: '500mb' }))
app.use(bodyParser.urlencoded({ extended: true }))
var fs = require('fs');
var privateKey = fs.readFileSync('privkey.pem');
var certificate = fs.readFileSync('fullchain.pem');
var credentials = { key: privateKey, cert: certificate };
var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);
app.all('*', function (req, res, next) {
res.set('Access-Control-Allow-Origin', req.header('origin') || req.header('x- forwarded-host') || req.header('referer') $
res.set('Access-Control-Allow-Credentials', true);
res.set('Access-Control-Allow-Methods', 'POST,GET,PUT,DELETE');
res.set('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Authorization,Access-control-request-headers,i$
if ('OPTIONS' == req.method) return res.send(200);
next();
});
var port = process.env.PORT || 5001;
httpsServer.listen(port, () => console.log(`Listening on port ${port}`));
certbot --apache
將完成 SSL 配置的所有安裝和設置。 使用上面列出的解決方法,您可以完成它。 但是,如果您希望您的服務器將所有HTTP
重定向到HTTPS
使用以下配置。
sudo nano /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
ServerName test.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =test.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
</VirtualHost>
然后執行
sudo service apache2 restart
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.