记得用完服务器机器要关机(并选择停止计费)
记得用完服务器机器要关机(并选择停止计费)
记得用完服务器机器要关机(并选择停止计费)
记得用完服务器机器要关机(并选择停止计费)
前置条件
- 安装Node.js 8+
- 理解IP和端口
- 理解URL路径和查询参数
- 不需要会JavaScript
- 本节所有代码建议复制使用
演示 Node.js Server
请求与响应模型
前端的代码在客户端Client(浏览器、APP)
IP 124.124.233.233:80
请求->服务器(Sever)
服务器(Sever)
IP 123.123.233.233:80
响应->客户端
如何发请求
方法
- 用Chrome(地址栏输入URL)
- 用
curl
命令
开发者工具Network面板,刷新页面
响应看Response
,HTML CSS JS image等
概念
- 帮你发送请求的工具叫「用户代理」
- 即「User Agent」
- 用Chrome时的用户代理就是Chrome
- 用
curl
时的用户代理就是curl
如何模拟一个响应
用curl
需用编程
- Node.js有一个http模块可以做到
- 使用以下初始代码:
全部测试代码
|
|
只要请求了8888
端口,就会被server.js
监听,每一次请求,就运行一遍此代码
注意事项
- 这些代码就是服务器代码,一般放在服务器上
path
是不带查询参数的路径/x
query
是查询参数的对象形式{a:'1'}
queryString
是查询参数的字符串形式?a=1
pathWithQuery
是带查询参数的路径,一般不用request
是请求对象response
是响应对象
主要代码
|
|
代码逻辑
语法
注意``,和
''
是不同的符号
- ``,这种字符串里面可以回车
- '',这种字符串要回车只能用
\n
表示
逻辑
- 每次受到请求都会把中间的代码执行一遍
- 用
if else
判断路径,并返回响应 - 如果是已知路径,一律返回
200
- 如果是位置路径,一律返回
400
Content-Type
标示内容的「类型/语法」response.write()
可以填写返回的内容response.end()
表示响应可以发给用户了
nodejs-test
启动应用
node server.js 8888
或者
node server 8888
添加路由
- 编辑
server.js
文件,添加if else
- 重新运行
node server.js 8888
后台启动应用
|
|
用curl
访问8888
,或者用浏览器
用curl
|
|
用浏览器
|
|
查看终端的变化
遥想当年李爵士
Li写了世界上第一个服务器程序
- 自己也完成了一个服务器程序,虽然代码是抄来的
Li写了世界上第一个网站
- 自己在
/
路径返回一个HTML
内容 - 然后再
/x
路径返回一个CSS
内容 - 然后再
/y
路径返回一个JS
内容
要记住的
|
|
本质就是根据路径返回一个字符串或者文件
后缀是垃圾
- URL里的后缀卵用没有,eg:
/y.css
不一定是CSS内容 Content-Type
才是决定文件类型的关键
系统学习HTTP
HTTP到底是个啥
必须学会什么
- 基础概念(必会知识):请求和响应
- 如何调试(用的是Node.js,可以用
log/debugger
,但本质还是HTTP) - 在哪查资料(用的是Node.js,看Node.js文档)
- 标准制定者(HTTP规格文档:
RFC 2612
等)
如何学
- Copy 抄文档
- Run 放在自己的机器上运行成功
- Modify 加入一点自己的想法,然后重新运行
开发者工具
查看Network
:分General
、Response Headers
即请求、Request Headers
即响应
HTTP基础概念:请求
请求的组成
- 请求动词 + 路径查询参数 + 协议/版本(请求行)
Host
:域名或IP及端口(请求头)Accept
:表示接受的内容格式,text/html(请求头)Content-Type
:请求体的格式(请求头)- 回车
- 请求体(即放上传内容,可以是任意内容,但格式必须在请求头中写明)
测试查看
curl -v POST --data '上传内容' http://localhost:8888/
细节
- 三部分:请求行、请求头、请求体
- 请求动词有
GET/POST/PUT/PATCH/DELETE
等 Get
:获取;Post
: 上传/?wd=hi
:路径及查询参数HTTP/1.1
协议及版本号- 请求体在
GET
中一般为空 - 文档位于 RFC 2612第五章
- 大小写不明感(随意,但涉及JS代码是大小写敏感的)
HTTP基础概念:响应
响应的组成
- 协议名/版本 + 状态码 + 状态字符串(状态行)
Content-Type
:响应体的格式text/html;charset=utf-8
(响应头)- 回车
- 响应体(即下载内容,可以在
Response
选项中查看具体内容)
细节
- 三部分:状态行、响应头、响应体
- 常见状态码(面试重点)
- 文档位于 RFC 2612 第六章
要记住关于HTTP:请求和响应的规范写法
- 请求的组成:请求行「请求动词 + 路径查询参数 + 协议/版本」+ 请求头「
Host
+Accept
+Content-Type
等」+ 请求体 - 响应的组成:状态行「协议名/版本 + 状态码 + 状态字符串」+ 响应头「
Content-Type
等」+ 响应体 - 常见状态码
用curl构造请求
回忆 curl 五行请求…
在server.js
开启的前提下:
curl -v http://127.0.0.1:8888
curl -v http://localhost:8888
-v
:verbose,看过程- 注意不是
https://
设置请求动词
-X POST
- 注意大小写敏感
curl -v -X POST http://localhost:8888
curl -v -X POST http://localhost:8888/xxx?wd=hi
加个查询curl -v -X POST http://localhost:8888/xxx\?wd=hi
加个查询,用Mac的终端curl -v -X POST http://localhost:8888/xxx?wd=hi#nihao
锚点不会发送到服务器- 看终端里返回的请求行
设置路径和查询参数
- 直接在url后面加
设置请求头
-H 'Name:Value'
或者--header 'Name:Value'
- 单引号内必须是以键值对的形式
比如
curl -v -H 'Accept:text/html' http://localhost:8888/xxx\?wd=hi#nihao
设置请求体
-d '内容'
或者--data '内容'
比如
curl -v -H 'Accept:text/html' -H 'FSociety:FyE' -H 'Content-Type:text/plain;charset:utf-8' -d '请求体的内容' http://localhost:8888/xxx\?wd=hi#nihao
- 看终端里返回的请求行
用Node.js读取请求
读取请求动词
request.method
读取路径
-
request.url
路径,带查询参数 -
path
纯路径,不带查询参数 -
query
只有查询参数 -
curl http://localhost:8888/\?hihihi=hohoho
-
看终端里返回的请求行
读取请求头
-
request.headers['Accept']
-
curl -v -H 'Hi:nihao' http://localhost:8888/
-
看终端里返回的请求行,可以得到所有符合格式的请求头
读取请求体
- 比较复杂,待续~~~
用Node.js设置响应
设置响应状态码
response.statusCode = 200
response.statusCode = 201
response.statusCode = 299
response.statusCode = 300
设置响应头
response.setHeader('Content-Type','text/html')
设置响应体
response.write('内容')
- 可追加内容
代码具体细节先不管,直接抄,运行看
- 整个响应都可以有node来控制,包括响应状态码、响应头、响应体
404页面是什么
curl
不仅可以用来测试,还可用来下载curl https://xxx.jpg > 1.jpg
curl
可以完成Chrome除了显示界面外的几乎所有功能- 即使状态码为404,还是能接受到响应体,需要设置
- 状态码和内容没有直接的关系,即不管状态码是什么,都可以是任何内容
- 大部分服务器不设置404页面,不返回任何其他内容
如何调试JS
怎么知道自己写错了还是写对了
console.log调试大法
不要相信直觉,相信
console.log
debug就是不断质疑自己的过程
不信,比如,只看,下面代码哪里有问题?
|
|
出bug就是因为自己太过自信了
找到bug之时,就是发现自己傻X之日
第一次讲console.log调试大法
console.log
可以验证对错
针对之前的错误代码,可以在if
判断前可以加上:
|
|
false
不要相信自己,要相信
console.log
答案揭晓:所有HTTP路径都是以
/
开头,./
就访问不了,404了把自己认为对的变量或者判断语句打出来
100元购买阿里云服务器
购买一台服务器
阿里云按量付费,即用即停 最低配,按量计费,Ubuntu 64
为什么要用收费的服务器
好处
- 一个你可以完全自由掌控的Linux机器
- 一个其他人可以访问的IP
- 可以作为博客、作品展示、简历展示
- 速度快于GitHub
- HK地区机器,可作为FQ代理,但不能备案,所以不选
- 如果备案了,还可以把域名绑定到这台机器
代价
- 100RMB用1000hrs
- 记得关服务器
购买阿里云服务器
流程
- 注册账号
- 进入云服务器ECS(可以搜索)
- 创建实例->按量付费->入门级->最便宜或打折优惠
- 镜像选
Ubuntu 18.04 64位
,最容易搜教程 - 其他不改,下一步
- 充值100
- 公网宽带选
按流量+1s
,哦不按流量+1Maps
- 其他不改,下一步
- 勾选服务协议,创建实例,弹出界面点击管理控制台
- 等待实例启动成功,状态变为运行中
- 购买完毕
允许8888
端口
加入安全组
流程
更改实例规格>更多>网络和安全组>加入安全组
,点击加入安全组- 如果没有安全组,就新建一个
- 加入之后,
更改实例规格>更多>网络和安全组>安全组配置
,点击安全组配置 - 点击配置规则
- 点击添加安入组规则
- 端口填写
8888/8888
,(任意超过1234,小于65535的范围比如8000/8999
) - 授权对象填写
0.0.0.0/0
表示任何人都能访问 - 点击确定,并输入手机验证码
- 此时,就可通过
http://实例IP:8888
访问了
请根据实际场景设置授权对象的CIDR,另外,0.0.0.0/0 代表允许或拒绝所有IP的访问,设置时请务必谨慎。参考帮助文档
使用服务器
流程
- 重置实例密码:更改实例规格>更多>密码/密钥>重置实例密码
- 填写新的密码两次和手机验证码
- 实例状态->重启实例
- 重启完了后点击远程连接
- 复制远程密码
- 在实例上新建标签,键为key,值为复制的密码
- 再次点击远程连接,输入连接密码
login:
后输入root
password:
输入密码,输入的时候没有反应为正常情况
现在,已经有一台
Linux
机器,不管是阿里云上的,还是本地的虚拟机具体过程可能改版更新,密码可以随时修改,远程连接码不一定使用,使用实例密码即可
服务器配置
ssh
远程登录
流程
- 首先登陆
root
账户(阿里云网页登陆或者其他) - 成功看到
Welcome...
后 - 把本地的SSH公钥复制到
~/.ssh/authorized_keys
,用echo 'xxx公钥' >>
- 建议把上面命令在VSCode上编辑好再复制
- 新建终端,在本地运行
ssh root@实例IP
- 看到
Welcome to Alibaba Cloud Elastic Compute Service !
后,此时,就可以在本地终端用ssh
操作云服务器了
成功界面
Welcome to...
用exit
退出,logout
刚才做了什么
- 把本地的公钥复制到阿里云的
~/.ssh/authorized_keys
- 在本地用
ssh root@实例IP
来远程操作云机器 - 以后都用
ssh root@实例IP
的方式即可 - 可以在hosts里给实例IP取个别名
- 要退出云机器,输入
exit
,回车 - 如果卡了,直接
Ctrl + w
退出终端
如何防止ssh卡住
(可跳过)
- 在
/etc/ssh/ssh_config
最后加下面两句话
|
|
- 用VScode打开这个文件会失败
- 可以用两次echo搞定
|
|
- 不要少写了空格
- 重启终端生效,如果没有就重启
- 从这里抄来的
- 工具能用就行
创建普通应用账户
为什么
Linux
的root
账户拥有最高权限,一旦被攻克…
步骤
root
账户账户下adduser yourname
注意必须都小写Enter new UNIX password:
输入密码- 再次输入密码,可以和
root
的一样 - 一直回车,直到结束,运行如下命令
|
|
现在
ssh yourname@实例IP
就可以使用了
多账户示意:
ssh root@ip
访问root /root
ssh frank@ip
访问frank /home/frank
sudo
给user
添加sudo
权限
adduser username sudo
sudo
是什么
- 全称
super user do
- 类似于win的「以管理员身份运行」
- 平时不该使用
root
账户,而是frank
账户 - 遇到特殊操作,就在前面加
sudo
,请出root
- 需要输入
frank
的密码,不是root
的密码 - 使用
ctrl + a
可以快速回到命令前面,ctrl + e
到最后 sudo!!
的意思是用sudo
执行上一句命令- 比如运行
apt-get update
更新包
部署 Node.js 代码
安装过
Node.js
和git
的可跳过,直接看### 部署应用
安装Node.js 8.x+
流程
|
|
安装git
命令
|
|
注意
- 由于远程无界面环境,安装不了VSCode,虽然vim可以
- 不使用
git commit -v
,改用git commit -m "xxx"
- 如果想学习
vim
,在本地电脑输入vimtutor
看完 - 一开始不要浪费时间学
vim
,推荐若愚的vim教程 - 自行搜报错信息
- 实在不行,就去阿里云页面重启机器即可
部署应用
下载代码
|
|
这个地址可以改成仓库的
https
地址,只是下载测试,所以不要使用ssh
地址,使用https
启动应用2
cd nodejs-test
touch log
- 启动命令:
node server.js 8888 > log 2>&1 &
- 把启动命令做成
start
文件:touch start
- 添加可执行权限:
chmod +x ./start
,使其可执行带rw-x
- 运行
sh ./start
得到一个进程号pid
,记下来,比如是:[1] 19225
tail log
看log
内容kill -9 pid
可以关掉进程,即kill -9 19225
killall node
可以关掉所有node
进程
如何重启应用
上传代码
本地改完代码后,
git push
下载代码2
ssh frank@实例IP
cd nodejs-test/
git pull
killall node
(因为忘了进程号,实际上可以记下来)sh./start
- 重启完毕
回顾
- 请求和响应分别有那几部分
- 请求动词有哪些
- 状态码有哪些
- 用
curl
构造请求 - 用
Node.js
读取请求,造响应 HTML/CSS/JS
本质都是字符串- 部署
Node.js
应用到云服务器
阿里云停机操作
记得用完服务器机器要关机(并选择停止计费)
记得用完服务器机器要关机(并选择停止计费)
Node.js 初体验
方便大家复制的代码
|
|
有问题的代码
|
|
ssh 远程登录
|
|
防止 ssh 卡住
|
|
创建应用账户
|
|
安装 Node.js 8和git
|
|
部署应用2
|
|
如何重启应用2
|
|
强烈建议购买阿里云服务器最低配
!记得用完服务器机器要关机(并选择停止计费!)
参考文章
相关文章
- 无
- 作者: Joel
- 文章链接:
- 版权声明
- 非自由转载-非商用-非衍生-保持署名
- 河 掘 思 知 简