目录

一、创建node服务(个人电脑)

二、创建web项目(个人电脑)

三、把node和web部署到服务器

1.服务器端准备工具

2.部署node服务

3.部署web

四、源码



一、创建node服务(个人电脑)

我们用极简的方式在本地电脑创建服务,没有任何附加功能

1.新建一个server文件夹

2.进入server文件夹,使用npm init 或者yarn init,然后一路enter

3. yarn add  express cors  (express 封装了http等插件的框架, cors解决跨域)

4.在server 内新建 server.js,代码如下:

var express = require('express')
var cors = require('cors');

var app = express();
app.use(cors())

app.post('/api/test', (req, res) => {
    res.json({
        code: 0,
        message: '成功',
        content: '接口调用成功',
    })
})

app.listen(4000, () => {
    console.log('正在监听4000端口');
})

5.启动,输入node server(或node server.js),看到dos 窗口如下表明接口服务启动了

nodeport在宿主机看不到端口_nginx

6.使用接口调用工具postman,可以直接调用试试,得到返回值,证明接口没问题

 

nodeport在宿主机看不到端口_云服务_02

或者接口改用get方式,然后直接在浏览器访问

var express = require('express')
var cors = require('cors');

var app = express();
app.use(cors())

app.get('/api/test', (req, res) => {
    res.json({
        code: 0,
        message: '成功',
        content: '接口调用成功',
    })
})

app.listen(4000, () => {
    console.log('正在监听4000端口');
})

nodeport在宿主机看不到端口_nodeport在宿主机看不到端口_03

二、创建web项目(个人电脑)

创建web ,这里使用最常用的脚手架 create-react-app

1.npx create-react-app  web

2.打开 App.js 我们使用原生的fetch 调用接口, 运行查看控制台 network

import React from 'react';
import logo from './logo.svg';
import './App.css';

function App() {
  const testApi = () => {
      fetch('http://localhost:4000/api/test', { method: 'POST' })//上传到云服务器中时,此处的localhost需更换成具体的云服务器公网IP
        .then((res) => {
           return res.json()
        })
        .then((data) => {
          console.log(data);
        })
  }
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
        <button onClick={testApi}>测试接口</button>
      </header>
    </div>
  );
}

export default App;

npm run start 启动react项目,点击"测试接口"按钮本地调用成功如下:
(本地电脑调用接口时报错了,web部署到服务器后能调用到公网IP上的接口)

nodeport在宿主机看不到端口_App_04

4.编译打包web

npm run build  打包项目
注意:需要在package.json中加入  "homepage": "react_demo"

nodeport在宿主机看不到端口_App_05

homepage的作用是设置应用的根路径,我们的项目打包后是要运行在一个域名之下的,有时候可能是运行在根域名下,也有可能运行在某个子域名下或域名的某个目录下,这时候我们就需要让我们的应用知道去哪里加载资源,这时候就需要我们设置一个根路径。
 

三、把node和web部署到服务器

1.服务器端准备工具

依次安装即可
nginx   

        安装nginx,参考https://www.runoob.com/linux/nginx-install-setup.html
        配置全局nginx命令,参考https://www.cnblogs.com/NTWang/p/13066602.html
git
     yum -y install git
nvm (非必须
        node版本管理工具
        curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash           source ~/.bashrc // 使当前shell读入路径为filepath的shell文件并依次执行文件中的所有语句,通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录
node
        下载安装node
        nvm i stable  // 安装最新稳定版node
        使用nvm安装node之后,直接运行node命令会报错 node: command not found?forever
        node的守护进程    
        npm i forever -g // 参考          forever list 正在守护的项目
        forever stop 项目目录  停止守护  
        forever start 项目目录 开启守护

2.部署node服务

1.服务器中创建www文件夹,然后在www文件夹中创建存放node项目的目录

        cd var
        mkdir www
        cd www 
        mkdir react_demo_server        //存放node项目

2.将本地电脑node项目上传到云服务器,通过git或者scp命令

进入react_node_server/server目录
scp -r * root@xxx.xxx.xxx.xxx:/var/www/react_demo_server
node_modules依赖也上传到云服务器中了。也可以不上传,在服务器中通过npm i下载依赖

3.运行node服务

node server.js        (node服务配置的是4000端口,需要在阿里云控制台添加安全组规则)

此处在阿里云 安全组规则 的4000端口设置了允许和禁用,都没有影响接口的访问。

nodeport在宿主机看不到端口_nodeport在宿主机看不到端口_06

4.测试接口(在[3.部署web]之后的网页中点击“测试接口”按钮)

  在测试页点击测试,查看控制台看到返回结果则前后端部署完成。

5.守护node进程,永久运行

  最后使用forever 来守护node进程(如果我们直接用node去运行,当关闭服务器远程链接时,ndoe服务也会关闭)
  forever start /var/www/react_demo_server/server.js

3.部署web

1.本地电脑打包web项目,前面已打包

2.在服务器www文件夹中创建存放web项目的目录
        cd var/www 
        mkdir react_demo        //存放web项目

3.将本地电脑web(build目录)上传到云服务器,通过git或者scp命令

进入web目录
scp -r build/* root@xxx.xxx.xxx.xxx:/var/www/react_demo

4.云服务器中配置nginx,并启动nginx

打开nginx配置文件编辑:vim /usr/local/nginx/conf/nginx.conf
下面内容复制放在server里面 ps:可以配置多个站点
# react_demo
location /react_demo {
    root /var/www;
    index  index.html index.htm;
}

nodeport在宿主机看不到端口_nginx_07

启动nginx:./nginx

在本地电脑浏览器中打开“服务器地址+react_demo”,比如:xxx.xxx.xxx.xxx/react_demo,
正常打开说明web部署完成并且成功。      
如果出现页面报404 ,则需要检查nginx配置 ,文件路径。
如果是加载资源404,去需要看下资源加载路径,看看homepage的配置和nginx是否对应。

注意:本地电脑浏览器可以分别打开xxx.xxx.xxx.xxx和xxx.xxx.xxx.xxx/react_demo访问不同的站点内容。

5.web项目调用服务器接口IP的两种写法区别

前提:web项目通过build编译打包上传到云服务器中,然后使用nginx运行

localhost 和 实际公网IP

5.1 ip端口设置为localhost时,无法访问到云服务器中接口

nodeport在宿主机看不到端口_nginx_08

 

nodeport在宿主机看不到端口_云服务_09

6.2 ip端口设置为具体云服务器的公网IP时,能访问到云服务器中的接口

nodeport在宿主机看不到端口_App_10

nodeport在宿主机看不到端口_nodeport在宿主机看不到端口_11

四、源码

react_node_server