如何使用 Nginx 部署 React App 到 linux server

news2025/7/19 15:42:18

油鹳视频:How To Deploy A React App - Using NGINX & Linux
https://www.youtube.com/watch?v=KFwFDZpEzXY&t=547s


1. 获得一个 linux server

方法很多种,例如 aws EC2 , 阿里云 ECS , linode 等

2. 登录远程服务器并设置服务器

命令行使用 ssh 登录,例如:

C:\Users\yanchun>ssh root@39.106.35.44

然后对服务器进行一些基本设置,使其具有更高的安全性。

2.1 更新服务器上所有软件

apt update

2.2 升级所有软件

apt upgrade

2.3 设置时区

dpkg-reconfigure tzdata - set timezone

在出现的界面中选择时区,完成设置:

Current default time zone: 'Asia/Shanghai'
Local time is now:      Fri Nov 25 20:42:10 CST 2022.
Universal Time is now:  Fri Nov 25 12:42:10 UTC 2022.

可以输入 date 命令确认时间是否正确:

root@localhost:~# date
Fri Nov 25 08:45:24 PM CST 2022

2.4 禁用 root 访问权限,防止其他人使用 root 登录。

2.4.1 创建新用户:

adduser alice

然后输入密码

2.4.2 将新建用户加入 sudo 组,使其具有管理员权限

adduser alice sudo

2.4.3 禁用 root 密码

首先退出登录:

logout

然后使用新建帐号登录:

ssh alice@39.106.35.44

禁用 root 密码,使用以下命令移除 root 密码:

sudo passwd -d root

然后锁定 root 密码:

sudo passwd -l root

之后无法再次以 root 登录。

3 配置 Nginx

3.1 安装 Nginx

sudo apt install nginx

3.2 创建文件夹,以放置 app 源代码文件

sudo mkdir /var/www/39.106.35.44

文件夹的名称,就是自己的服务器的公用 ip 地址,或者托管网站时的域名。这里的 ip 39.106.35.44是我买的阿里云服务器的 IP。
The name of the directory is going to be the public ip address of our server, or the domain that you’re using when you’re hosting this website.
所以 ip 或者域名二选一。

3.3 更改该目录的权限和所有权

3.3.1 允许所有人访问此目录的内容

sudo chmod 755 -R /var/www/39.106.35.44/

3.3.2 然后使当前用户 alice 成为目录 /var/www/39.106.35.44/ 的所有者

alice 是之前创建的用户,也是当前登录用户.

sudo chown -R alice:www-data /var/www/39.106.35.44/

运行以上两条命令的目的是,使得当我们实际运行我们的部署脚本时,我们能够更新目录 /var/www/39.106.35.44/ 中的内容。

3.4 创建 Nginx 配置文件

创建此配置文件,使 Nginx 链接前面创建的目录,如果用的是 domain,ip 也可以换成 domain:

sudo nano /etc/nginx/sites-available/39.106.35.44

输入以下内容并保存:

server {
        listen 80;
        listen [::]:80;
        root /var/www/39.106.35.44;
        index index.html;
}

/var/www/39.106.35.44 是 app 源代码放置路径, app 的基本 html 页面应该是 index.html,与这里设置的相同。

配置文件设置完成,测试 Nginx 是否在正常工作:

sudo nginx -t

显示:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

3.5 取消链接(unlink)默认配置文件并链接(link)刚刚创建的新配置文件

3.5.1 取消链接默认配置文件

sudo unlink /etc/nginx/sites-enabled/default

然后将链接替换为新创建的配置文件

3.5.2 创建新链接

sudo ln -s /etc/nginx/sites-available/39.106.35.44 /etc/nginx/sites-enabled/

可以再次测试 nginx:

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

3.6 重启 nginx

sudo systemctl restart nginx

可以再次测试 nginx 是否正常工作:

sudo nginx -t

至此,远程 linux server 基本配置完成。

4 部署

从本地部署代码到在远程 server 上创建的目录,即 /var/www/39.106.35.44/

4.1 本机安装 git

如果是 windows 系统,一定要装 git bash, 因为这个 tool 会用到。

4.2 本机创建 react app

VS code 终端运行命令

npx create-react-app demo

然后在该工程中创建文件 deploy.sh:

echo "Switching to branch master"
git checkout master

echo "Building app..."
npm run build

echo "Deploying files to server..."
scp -r build/* alice@39.106.35.44:/var/www/39.106.35.44/

echo "Done!"

在这里插入图片描述
scp 命令用于执行文件传输。

4.3 打开 git bash

Windows 系统用 git bash, 如果是 linux 或 macos 打开任意终端就行。
进入工程文件夹:

yanchun@Alice-ThinkPad-E15 MINGW64 /d/temp/demo (master)
$ ls
README.md  build/  deploy.sh  node_modules/  package-lock.json  package.json  public/  src/

yanchun@Alice-ThinkPad-E15 MINGW64 /d/temp/demo (master)
$

然后运行命令 chmod, windows 上不确定是否需要此命令,但 linux macos 需要此命令将 .sh 变成一个可执行文件:

yanchun@Alice-ThinkPad-E15 MINGW64 /d/temp/demo (master)
$ chmod u+x deploy.sh

4.5 运行 deploy.sh 部署代码:

yanchun@Alice-ThinkPad-E15 MINGW64 /d/temp/demo (master)
$ ./deploy.sh
Switching to branch master
Already on 'master'
M       src/App.js
Building app...
Deploying files to server...
............................................................
Done!

可以登录远程 linux 服务器,查看传送过去的代码,可以看到里面有一个文件叫做 index.html

ssh alice@39.106.35.44
cd /var/www/39.106.35.44/
ls

5. 打开浏览器,输入 IP 地址,可以看到刚刚部署成功的网站

在这里插入图片描述

如果要更新 app,可以直接修改本地代码,用 git bash 再次执行当前工程里的 deploy.sh

如果要部署 Vue app, 因为 npm run build 后生成的代码文件夹名称是 dist,所以将 deploy.sh 里的 public 改成 dist 就行,其他依此类推。

scp -r dist/* alice@39.106.35.44:/var/www/39.106.35.44/

如果再增加一个 nginx 配置文件,可以部署第 2 个 app,例如在 port 81 端口监听:
/etc/nginx/sites-available/39.106.35.44

server {
        listen 81;
        listen [::]:81;
        root /var/www/my_react_app_port81;
        index index.html;
}

上面某些对应的步骤要重复,deploy.sh 里的路径也要对应修改。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/38050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二十八、CANdelaStudio实践-10服务(SessionControl)

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍10服务(DiagnosticSessionControl)的查看与编辑,欢迎…

看我如何连夜自建网站背刺我的求职对手们

摘要:在竞争如此激烈的当下,作为一名IT新人,怎么才能让HR眼前一亮,从万千简历中脱颖而出成为最亮的那个崽呢?本文分享自华为云社区《【一行代码秒上云】连夜自建网站背刺我的求职对手们 !》,作者…

红队隧道加密之OpenSSL加密反弹Shell(一)

前言 在红队的后渗透阶段中, 往往需要反弹shell进行下一步的内网横向渗透, 而这种反弹shell大多数都有一个缺点, 那就是其传输的流量都是明文传输, 相当容易被内网的防火软件所捕捉, 要是蓝队对此流量进行朔源分析, 很容易就能复现攻击的整个流程 例如此处用netcat反弹Shell进…

十、CANdelaStudio入门-States

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的States概念,欢迎各位朋友订阅、评论,可…

AcWing245. 你能回答这些问题吗 线段树详解

3.2线段树 例题分析 245. 你能回答这些问题吗 - AcWing题库 **题意:**给一条序列,如何动态维护区间的最大子段和,包括询问某区间的最大字段和和修改某个数。 分析:线段树struct保留什么信息。能否通过左右儿子的这些信息求出父…

HA RabbitMQ on K8s helm部署实战

RabbitMQ on K8s helm部署实战获取helm chart修改必要参数外部如何访问?安装rabbitmq登录管理界面导入mq metadata优化helm chart 生成的statefuleset yamlhelm chart 生成的pod yaml调整mq log等级promethrus 监控mq配置prometheus采集metrics查看prometheus rabbi…

零基础借助arpl自动编译工具在一小时之内将旧笔记本、嵌入式设备等改造成黑群辉

文章目录1. 前言2. 编译2.1. 到GitHub把编译引导需要用的img文件下载到电脑上2.2. 将下载下来的IMG文件解压为img文件,用rufus或者其他写盘工具写入到U盘中,2.3. 进行引导启动2.4. 获得编译系统的IP地址2.5. 在同一局域网下,打开这个IP地址2.…

Java学习笔记 --- IO流

一、文件 什么是文件 文件是保存数据的地方 文件流 文件在程序中是以流的形式来操作的 流:数据在数据源(文件)和程序(内存)之间经历的路径 输入流:数据从数据源(文件)到程序&a…

Pr:文本面板之转录文本

Pr菜单:窗口/文本Text在文本面板的转录文本 Transcript选项卡中,单击“转录序列” Transcribe sequence按钮,然后设置好选项并进行语音到文本的转录。创建转录文本对话框Create transcript语言Language选择视频中语音所使用的语言。也可选择不…

2.7 基本放大电路的派生电路

在实际应用中,为了进一步改善放大电路的性能,可用多只晶体管构成复合管来取代基本电路中的一只晶体管;也可根据需要将两种基本接法组合起来,以得到多方面性能俱佳的放大电路。 一、复合管放大电路 1、复合管 (1&…

【路径规划】(1) Dijkstra 算法求解最短路,附python完整代码

好久不见,我又回来了,这段时间把路径规划的一系列算法整理一下,感兴趣的点个关注。今天介绍一下机器人路径规划算法中最基础的 Dijkstra 算法,文末有 python 完整代码,那我们开始吧。 1. 算法介绍 1959 年&#xff0c…

Bugku MISC 啊哒 贝斯手

啊哒 下载文件,解压后发现是一张图片,用010editor打开 可以看到里面有个flag.txt 。使用kali中的binwalk进行文件分离 查看文件 : binwalk ada.jpg 分离文件 : binwalk -e ada.jpg --run-asroot 打开分离后的文件夹 可以看到有一…

T288401 B-莲子的机械动力学

专攻超统一物理学的莲子,对机械结构的运动颇有了解。如下图所示,是一个三进制加法计算器的(超简化)示意图。 一个四位的三进制整数,从低到高位,标为 x_1,x_2,x_3,x_4x1​,x2​,x3​,x4​。换言之&#xff0…

第八章《Java高级语法》第12节:Lambda表达式

Lambda 表达式是 JDK8 的一个新特性,它可以定义大部分的匿名内部类,从而让程序员能写出更优雅的Java代码,尤其在集合的各种操作中可以极大地优化代码结构。 8.12.1 认识Lambda表达式 一个接口的实现类可以被定义为匿名类。经过大量实践,人们发现定义一个接口的匿名实现类…

ADAU1860调试心得(8)FASTDSP-0 通道输入

这个程序,我们正式要用到 DSP 了,ADC 进来的数据,经过 FASTDSP 的算法进行处理,再 送给 DAC 推到耳机,通道我们输入 0 到输出为例,还是先做直通,DSP 路过一下,并不做处理。 首先是寄…

WebStorm创建第一个Express项目

WebStorm创建Express项目步骤如下: 1、在WebStorm创建项目 选择项目存储位置,然后点击create,再选择创建的窗口,一般都是创建在this window上 2、进入窗口会终端会开始下载Express项目所需要的文件,我们等到出现如下图…

C++中的多态(下)

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸 文章目录一、C11当中的final和overridefinaloverride二、重载&重定义(隐藏)&重写(覆盖)三、抽象类(接口类)四、接口继…

Hive数据定义语言DDL

文章目录1 Apache Hive客户端使用2 Hive编译工具3 Hive SQL DDL建表基础语法3.1 Hive数据类型详解3.2 Hive读写文件机制3.3 Hive数据存储路径3.4 案例--王者荣耀数据Hive建表映射4 Hive SQL DDL建表高阶语法4.1 Hive 内部表、外部表4.2 Hive Partitioned Tables 分区表4.3.1 数…

第九章 堆排序与TOPK问题

第九章:堆排序与TOPK问题一、堆排序:1、思路分析:(1)建堆(2)排序2、堆排序模板二、TOPK问题:1、什么是TOPK问题?2、解决方法一、堆排序: 假设我们实现一个小…

【数据结构】二叉树

目录 一、树 1.1树的一些重要概念 1.2树的应用 二、二叉树 2.1概念 2.2两种特殊的二叉树 二叉树的第一个特点 二叉树的第二个特点 二叉树的第三个特点: 2.3二叉树的存储 2.4二叉树的遍历-深度优先搜索(二叉树的高度)dfs 前序遍历…