1. 请求&响应
1.1 Concept
- 客户端向服务器端发送请求,服务器响应请求从同个端口向客户端发送response
- 发请求的工具叫用户代理(User-Agent)
2. Node.js 服务器
2.1 先导
- 启动服务器并监听端口:
node xxx.js [port]
- response 代码:
/* 引入http server相关的包 */
var http = require('http')
var fs = require('fs')
var url = require('url')
var port = process.argv[2] // 第2个参数指定为端口号
/* 要求用户输入端口号 */
if(!port){
console.log('Please describe the port number: node server.js 8888')
process.exit(1)
}
/* 配置服务器响应机制 */
var server = http.createServer(function(request, response){
/* 解析request路径 */
var parsedUrl = url.parse(request.url, true)
var pathWithQuery = request.url
var queryString = ''
if(pathWithQuery.indexOf('?') >= 0){ queryString = pathWithQuery.substring(pathWithQuery.indexOf('?')) }
var path = parsedUrl.pathname
var query = parsedUrl.query
var method = request.method
console.log('Query path is' + pathWithQuery)
/* 根据不同路径进行不同回复 */
if(path === '/'){
response.statusCode = 200
response.setHeader('Content-Type', 'text/html;charset=utf-8')
/* 可直接回复html 内容并使用<link href>引用css内容 */
// 不用单引号,``中可带回车
response.write(`
<!DOCTYPE html>
<head>
<link rel="stylesheet" href="/x">
</head>
<body>
<h1>Title</h1>
</body>
`)
response.end()
} else if(path === '/x'){
response.statusCode = 200
response.setHeader('Content-Type', 'text/css;charset=utf-8')
response.write(`body{color: red;}`)
response.end()
} else {
response.statusCode = 404
response.setHeader('Content-Type', 'text/html;charset=utf-8')
response.write(`No content exists.\n`)
response.end()
}
})
server.listen(port) // 开始监听指定端口
console.log('Now the server is listening to port ' + port + ' please open with the url: http://localhost:' + port)
2.2 Note
- URL后缀没用,文件类型看Content-Type中的描述
- Content-Type:类型/语法
text/css
和text/html
分别表示css和html文件 -
response.write
将内容写入response的body中 -
response.end()
执行后立即发送response - 在html中请求css用
<link rel="stylesheet" href="">
,href中加路径 - 在html中使用js用
<script src=""></script>
,src中加路径
3. HTTP系统
3.1 Concept
(1) 请求
请求行 + 请求头 + 请求体
- 基本格式:请求动词(GET POST DELETE PUT...) + 路径&参数 + 协议名/版本(HTTP/1.1)
- HOST:域名/IP
- Accept:想接收response的内容 text/html
/* 查看accept */
console.log(request.headers) // 查看header所有内容
var accept = request.headers['accept']
console.log(accept)
- Content-Type:请求体格式
- 上面为请求行和请求体内容,请求体用下一行隔开,GET请求体一般为空
(2) 响应
状态行 + 响应头 + 响应体
- 基本格式:协议名/版本 + 状态码 + 状态字符串
- Content-Type:响应体格式
- 上面为状态行和响应头内容,响应体用下一行隔开
- 常见状态码:喵星人教你 HTTP 状态码
返回404时部分浏览器自动显示404页面
3.2 用curl发请求
curl -v [url]
- 发送GET请求
curl -v [url] > [download path]
- 用GET下载文件
curl -v -X [method] -H [headers] --data [body] [url]
- 完整请求
- 设置请求动词:
-X [method]
- 设置路径和查询参数:直接加url里
注意锚点是不会发送到服务器的 - 设置请求头:
-H [headers]
- 设置请求体:
-d [body]
3.3 Node.js 处理请求和响应
(1) 处理请求
- url:
request:url
- method:
request.method
- headers:
request.headers[header]
(2) 设置响应
- statusCode:
response.statusCode
- header:
response.setHeader(header, content)
- body:
response.write(body)
write可以追加内容
4. 部署Node.js 代码
4.1 创建应用账户(当前为root账户)
adduser xyc # 创建用户,访问时使用xyc@ip进入应用账户
mkdir /home/xyc/.ssh # 创建.ssh文件
cp ~/.ssh/authorized_keys /home/xyc/.ssh/ # 复制公钥
chmod 755 /home/xyc/.ssh/authorized_keys # 赋予可读权限
chown xyc:xyc /home/xyc/.ssh/authorized_keys # 把key的拥有者变成xyc
# 在root账户运行 'adduser xyc sudo' 使其获得超级管理员权限
adduser xyc sudo
4.2 安装Node.js
- 需要管理员权限时在命令前加
sudo
-
ctrl + a
回到命令开头,ctrl + e
回到命令结尾
curl -sL https://deb.nodesource.com/setup_8.x | sudo bash -
sudo sed -i 's/deb.nodesource.com\/node_8.x/mirrors.tuna.tsinghua.edu.cn\/nodesource\/deb_8.x/g' /etc/apt/sources.list.d/nodesource.list
sudo apt-get update
sudo apt-get install -y nodejs
node -v
npm -v
npx -v
sudo apt install git
4.3 部署
git clone https://github.com/FrankFang/nodejs-test.git
cd nodejs-test
touch log
node server.js 8888 > log 2>&1 & # 后台启动,并把内容输出到log中
touch start # 把启动命令做成 start 文件
echo 'node server.js 8888 > log 2>&1 &' >> ./start
chmod +x ./start # 添加执行权限
sh ./start # 运行后得到一个进程号 pid
tail log # 看 log 内容
kill -9 pid # 可以关掉指定进程号的进程
killall node # 可以关掉所有 node 进程