【问题标题】:How to configure Apache server and node server in one domain?如何在一个域中配置 Apache 服务器和节点服务器?
【发布时间】:2020-04-17 12:49:20
【问题描述】:

我学习有困难。

我正在制作自己的 sns 应用程序,例如 Facebook 或 Instagram。 所以我完成了时间线功能,所以这次我要创建一个聊天。所以我想用node.js + socket.io做一个聊天功能。 这就是为什么我想知道如何构建 node.js 服务器。

我的开发环境是 Ubuntu 18.04 + apache2 + Mysql(+ Let’s Encrypt SSL 并且我有一个域)

即使我在 google 上搜索并查找,我也无法创建 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 套接字服务器。如果您能轻松详细地帮助我,那将非常有帮助。

服务器根路径 -> /var/www/html/

在android中使用的php文件夹路径-> /var/www/html/android

在 android 上使用的用户个人资料图片文件夹路径 -> /var/www/html/android/image

我想在以下路径中创建一个 node.js 文件。

在安卓上聊天的文件夹。 -> /var/www/html/android/聊天

我在 Google 上进行了搜索,但都失败了。否则,我看到的所有示例都只运行了一个 node.js 服务器。

我尝试了 proxypass 或 proxypassreverse 或Something but Failed。

【问题讨论】:

    标签: node.js apache


    【解决方案1】:

    尝试在服务器计算机上的任何空闲端口上运行您的服务器

    var https = require('https');
    https.createServer(options, app).listen(ANY_PORT);
    

    并在您的 android 代码中指定要连接的端口

    val url = URL("https://test.com:ANY_PORT")
    

    这对我有用。

    【讨论】:

      【解决方案2】:

      您可以做的一件事是使用 apache 进行反向代理。查看文档:https://httpd.apache.org/docs/2.4/howto/reverse_proxy.html

      这真正的意思是说你的 php 东西在端口 80 和 443 上运行。但是,现在你有一个节点服务在端口 3000 上运行。

      不过,您想将端口 3000 屏蔽为端口 80。所以您可以说您有 domain.com/chat 正在运行您的端口。因此,您可以侦听任何到达该路径的路由并将它们转发到运行该服务的应用程序。

      【讨论】:

        【解决方案3】:

        按照说明从 certbot.eff.org 安装 Letsencrypt 并使用此命令。在安装时选择No Redirect 选项。

        sudo certbot --apache
        

        使用以下命令从您的证书文件夹中复制 privkey.pemfullchain.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.jsserver.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

        【讨论】:

          猜你喜欢
          • 2015-07-29
          • 1970-01-01
          • 1970-01-01
          • 2015-04-10
          • 1970-01-01
          • 2014-09-26
          • 1970-01-01
          • 2019-11-01
          • 2016-07-12
          相关资源
          最近更新 更多