记nginx实践的思考与知识终结
nginx
疑问:谈到nginx的作用,第一反应就是反向代理,那么反向代理是什么呢?
反向代理
一般的网络请求我们会分为两种身份:客户端 & 服务器
nginx充当一个中间者,客户端以为是向服务器发送了请求,实际是发送给了nginx,nginx判断向哪个服务器发送请求,并将获得的内容返回给客户端:
客户端 <-> nginx <-> 服务器
nginx突破自身ip访问的限制,使得用户客户端能够通过代理访问到其他网站资源
笔者认为ip访问的限制在于:如果没有代理服务器,ip只能在同一个局域网内进行网站访问,这体现在生活中,同在教室的同学可以通过ip地址访问另一个同学本地启动的网站资源,但无法通过ip地址去访问身居外地的同学本地启动的网站资源,因为他们身处于不同的局域网
正向代理
客户端使用了某个介质服务器去访问响应的网络资源,向代理发送一个请求并指定目的服务器,由代理来转交请求;现实生活中可能会通过easyconnect去帮我们访问及获取某个网络资源,如在家公网访问公司内网内容。
区别:
通俗来讲
- 反向代理:网络用户在使用层面上会认为是在向目的服务器发送请求,并不知道中间还经历了反向代理这个过程,就像我们直接在浏览器上敲入一个url进行访问,你以为是向目的服务器发送了请求,实际经过了反向代理这一步骤
- 正向代理:网络用户明确知道这个代理服务器的存在,且需要进行设置(如下载安装,指定目的服务器)
配置信息语法
对nginx进行配置时,通过listen 端口号以及location句式去判断(具体笔者就不赘述了
在实践过程中使用了两个语法句式 alias 与 root
alias 与 root 区别
- alias会直接在配置的文件目录里找文件,即最终访问的实际路径是alias所配置的路径
location /turn{
alias /html/turn-h5/;
}
如果你访问/turn/ 下的某个文件,nginx会自动去/html/turn-h5/ 下找文件
假设你访问的路径是 https://配置的server_name/turn/
那么最终访问的实际路径是 https://配置的server_name/html/turn-h5/
root是最上层目录的定义,即最终访问的实际路径是root所配置的路径+location的路径
location /turn{
root /html/turn-h5;
}
如果你访问/turn 下的某个文件,nginx会自动去/html/turn-h5/turn 下找文件
假设你访问的路径是 https://配置的server_name/turn/
那么最终访问的实际路径是 https://配置的server_name/html/turn-h5/turn
ssl证书
由于实践任务的需要,笔者需要进行ssl证书的创建
主要过程:找到(阿里云、腾讯云)的ssl证书创建入口,点击创建ssl证书,绑定相应的域名,根据需要填写的内容操作即可。
ps: 具体可以搜索网上,有蛮多教程的
简而言之,ssl证书是为了能够使用https协议去访问对应域名
ssl证书的作用
现实网络请求:http协议(80端口)、https协议(443端口) http 与 https除了端口号不同还有什么区别:
- http 明文传输,https 是利用ssl加密传输,非对称加密
使用https发送请求的过程:
- 客户端连接服务器
- 服务器发送数字证书(包含公钥
- 客户端检查数字证书是否合法
- 是则随机生成密钥,再利用公钥对生成的密钥进行非对称加密,发送给服务器
- 服务器用私钥解密,得到客户端发的密钥,对数据进行对称加密,发送给客户端
- 客户端接收并用本地存储的密钥解密
总结以上:服务器掌握着私钥,并将公钥发送给了客户端,客户端使用公钥对随机生成的密钥进行加密,服务器使用私钥解密,得到密钥
安全保证
- 在客户端的密钥只有客户端和服务器知道;
- 密钥用非对称加密,数据用密钥进行对称加密
在阿里云申请ssl证书成功之后,下载对应nginx的ssl证书包含两个文件:pem后缀文件、key后缀文件 – 其实就对应数字证书、私钥
在腾讯云申请ssl证书成功之后,下载对应nginx的ssl证书会包含四个文件,其中pem后缀文件、crt后缀文件、key后缀文件(前两个实际内容是一样的,都包含了证书信息),key一样道理是私钥
ssl证书的申请在于安全保证的两个信息点:一个安全数字证书,一个服务器需要的私钥
https 配置实践
nginx配置文件上与http配置的server大致相同,只是需要额外添加一些信息
# http版本
server {
listen 80;
server_name xxxx;
location / {
root html;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /admin/{
proxy_set_header Host $host ;
proxy_pass http://ip:8080/;# ip是可以是公网ip,或者你使用docker部署时配置的ip
client_max_body_size 500m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# https版本
server {
listen 443 ssl;
server_name xxxx;#ssl证书绑定的域名
ssl_certificate 证书文件;# pem文件、crt文件均可
ssl_certificate_key 私钥文件;# 两个文件可以直接放在nginx.conf同一文件夹,如果另起文件夹,就需要注意配置完整的文件路径
ssl_protocols TLSv1.2 TLSv1.3;#表示使用的加密套件的类型,TLSv1.3 要nginx1.13版本才能使用
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
location / {
root html;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /admin/{
proxy_set_header Host $host ;
proxy_pass http://ip:8080/;# ip是可以是公网ip,或者你使用docker部署时配置的ip
client_max_body_size 500m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
- 如果nginx是通过docker 拉取镜像配置的,配置完成之后重启服务
- nginx出错,可以到
error.log 查看错误信息 docker-compose up 启动服务 如果nginx配置有问题会直接显示
- 注意:
docker-compose up 是直接启动的方式,如果你退出,那么该服务就停止了,通常使用docker-compose up -d 命令后台启动服务 - 另外下载的:通过cd 到对应nginx目录下,使用
./sbin/nginx -s reload 命令重启nginx
|