记得用完服务器机器要关机(并选择停止计费)
记得用完服务器机器要关机(并选择停止计费)
记得用完服务器机器要关机(并选择停止计费)
记得用完服务器机器要关机(并选择停止计费)
前置条件
- 安装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是不带查询参数的路径/xquery是查询参数的对象形式{a:'1'}queryString是查询参数的字符串形式?a=1pathWithQuery是带查询参数的路径,一般不用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:8888curl -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 = 200response.statusCode = 201response.statusCode = 299response.statusCode = 300
设置响应头
response.setHeader('Content-Type','text/html')
设置响应体
response.write('内容')- 可追加内容
代码具体细节先不管,直接抄,运行看
- 整个响应都可以有node来控制,包括响应状态码、响应头、响应体
404页面是什么
curl不仅可以用来测试,还可用来下载curl https://xxx.jpg > 1.jpgcurl可以完成Chrome除了显示界面外的几乎所有功能- 即使状态码为404,还是能接受到响应体,需要设置
- 状态码和内容没有直接的关系,即不管状态码是什么,都可以是任何内容
- 大部分服务器不设置404页面,不返回任何其他内容
如何调试JS
怎么知道自己写错了还是写对了
console.log调试大法
不要相信直觉,相信
console.logdebug就是不断质疑自己的过程
不信,比如,只看,下面代码哪里有问题?
|
|
出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:后输入rootpassword:输入密码,输入的时候没有反应为正常情况
现在,已经有一台
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 /rootssh 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-testtouch 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 19225killall node可以关掉所有node进程
如何重启应用
上传代码
本地改完代码后,
git push
下载代码2
ssh frank@实例IPcd nodejs-test/git pullkillall node(因为忘了进程号,实际上可以记下来)sh./start- 重启完毕
回顾
- 请求和响应分别有那几部分
- 请求动词有哪些
- 状态码有哪些
- 用
curl构造请求 - 用
Node.js读取请求,造响应 HTML/CSS/JS本质都是字符串- 部署
Node.js应用到云服务器
阿里云停机操作
记得用完服务器机器要关机(并选择停止计费)
记得用完服务器机器要关机(并选择停止计费)
Node.js 初体验
方便大家复制的代码
|
|
有问题的代码
|
|
ssh 远程登录
|
|
防止 ssh 卡住
|
|
创建应用账户
|
|
安装 Node.js 8和git
|
|
部署应用2
|
|
如何重启应用2
|
|
强烈建议购买阿里云服务器最低配
!记得用完服务器机器要关机(并选择停止计费!)
参考文章
相关文章
- 无
- 作者: Joel
- 文章链接:
- 版权声明
- 非自由转载-非商用-非衍生-保持署名
- 河 掘 思 知 简