#通过nginx部署前后端项目
- 前端:vue项目
- 后端:jar包
具体nginx配置
#虚拟主机04--开启科研管理系统
server {
listen 80;
#域名,该域名指向公网ip
server_name scientific.lovelsj.com;
#前端地址,这里是绝对路径
location / {
root /www/dist;
index index.html index.htm;
}
#后端路径,注意这里的Scientific是application.yml里面的server-servlet-context-path: /Scientific,寻找/Scientific下的接口
location /Scientific{
proxy_pass http://192.168.30.131:8060;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
nginx笔记
nginx介绍
nginx担当高性能的web服务器负载均衡器,流量网关,日志网关,日志服务器,贯穿了整个项目
- nginx开源版本比较干净,就是一个负载均衡和高性能服务器–开源
- nginx-plus东西更多,是nginx升级版本
- 将nginx和Lua脚本进行整合–开源
- 更安全,更稳定,性能更高–开源
虚拟机的安装
- 准备软件:
- Vmware
- Virtualbox
- Parallels
- 准备镜像
- Centos7.4镜像
- 安装与配置操作系统
- 配置虚拟机上网
先配置网卡,修改配置文件
- 配置虚拟机上网
2. 配置静态ip地址
- 配置静态的ip地址,否则虚拟机会随即生成ip地址,每次连接比较麻烦
Nginx开源版本的安装
- 首先进行解压缩nginx的tar包
- 解压完之后进入目录用编译安装的方式进行安装,用configure配置进行安装,如图,他缺少c语言编译
- 随即安装gcc
- 安装nginx,挑选位置进行安装
yum install -y gcc
./configure ==prefix=/usr/local/nginx
- 发现缺少库,随即安装perl库
yum install -y pcre pcre-devel
- 发现缺少zlib库,安装zlib库
yum install -y zlib zlib-devel
- 接下来执行:make , makei nstall
启动Nginx
- 安装成功之后进入安装好的目录** /usr/local/nginx/sbin**
- 启动nginx
./nginx
- 快速停止nginx
./nginx -s stop
- 优雅关闭nginx,在退出前完成已经接受的连接请求
./nginx -s quit
- 重新加载配置nginx
./nginx-s reload
- 进入目录之后输入 ./nginx启动nginx之后可以在浏览器输入ip地址,发现进不去,这时候是防火墙的问题
关于防火墙
- 关闭防火墙
systemctl stop firewalld.service
- 禁止防火墙开机启动
systemctl disable firewalld.service
- 放行端口
firewalld-cmd --zone=public --add-port=80/tcp --permanent
- 查看防火墙状态
systemctl status firewalld
- 重启防火墙
firewall-cmd --reload
- 我们关闭防火墙
随后能进去网页
- 随后关闭开机自启防火墙
安装系统服务
- 因为我们每次都得自启动太麻烦,所以可以写一个脚本
- 创建脚本服务
vi /usr/lib/systemd/system/nginx.service
- 服务脚本内容—注意脚本中的路径
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
- 先关闭之前的nginx服务
- 重新加载系统服务
systemctl daemon-reload
systemctl reload nginx
- 通过脚本启动nginx: systemctl start nginx
- 查看nginx状态: systemctl status nginx
- 开机启动
systemctl enable nginx.service
- reboot关机,在启动试一下nginx是否自启动
目录结构与基本运行原理
- 目录
- sbin中放的是启动nginx的主程序
- html中的index.html是加载的默认页面
- 50x.html是报错后的页面
- logs是记录日志的
- access.log记录访问日志,记录访问时间,请求具体文件,等等,所以这个日志可能会很大,达到一定程度会报错.
- error.log记录错误日志
- nginx.pid记录着893就是nginx的进程pid
-
更改默认页
就是更改index.html
-
基本运行原理
客户端发起一个请求,nginx端主目录下/sbin有个nginx可执行文件,将这个文件跑起来,会开启master的主的进程,在主进程中读取配置文件并且再次做一个校验,然后开启子进程worker,主进程不处理业务,子进程解析请求
Nginx基础配置 (最重要的内容)
- 最小配置文件
- 位置: /usr/local/nginx/conf/nginx.conf
- nginx配置文件大量的注释文件,去掉注释文件之后的简化conf
- 核心配置
- 虚拟主机配置
#工作的子进程个数,一个cpu内核对应一个进程
worker_processes 1;
events {
//每一个worker进程对应的连接数
worker_connections 1024;
}
#核心配置
http {
#引用其他的配置文件mime.types到主配置文件里,记录所有mime的type,mime的type就是请求的头,头里面记录着返回或者发送的文件是什么类型
include mime.types;
#如果mime.types里面没有对应的类型,哪么就用默认流形式
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#虚拟主机,每一个主机之间互相不干扰
server {
#监听80端口
listen 80;
server_name localhost; #域名,主机名
#http://lsj.cash/xxoo/index.html,location是匹配域名后面的资源 /xxoo/index.html
location / {
#相对路径
root html;
index index.html index.htm;
}
#http://lsj.cash/50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
虚拟主机和域名解析
- 域名,dns,ip地址的关系
- 浏览器,nginx与http协议
- 虚拟主机原理
- 通过ip地址打到这台服务器上,遵循的http协议,把数据报文返回给nginx,一台主机上可以对外来说一个公网ip就能访问了,但是一台主机不是实时有这么高的访问量,主机的资源会浪费的,我们可以在开一台主机,虚拟主机的话,我们可以把一台主机虚拟出来,本来我们通过域名才能访问到主机,一个域名对应一个ip地址,我们能不能想一下让多个域名对应到一个ip地址上,由nginx服务器端来判断你究竟的是访问哪一个域名,指向不同站点的目录就行,本质上也是访问一些资源,把资源放在不同的目录下,比如说我访问atguigu.com,http请求打过来了,访问的域名是atguigu.com,然后解析成一个ip地址,然后通过这个ip发送一个数据报文给nginx,nginx读到这个请求之后去对应的目录之下找数据资源,找到之后返回给客户端,以上的都是单机
- 那如果是两个域名同时解析到一个ip地址,那么就会在协议层上也就是http协议上增加一些内容,在请求的报文请求头上,加上要请求的域名是啥,因为请求目标的ip地址是一样的,在一个ip上绑定了两个域名,想要把他们区分开,把资源划分在不同的目录下,那么在请求下,除了ip地址那么把域名也写下来,nginx知道他请求的某一个域名,nginx去特定目录找资源另外一个域名也是,解析到了一个域名去相关目录下找资源
- 域名解析与泛域名解析实战
- 我们可以更改本地hosts文件里的域名,第三个就是添加的虚拟机的域名和ip
- 我们ping一下这个域名看能不能通,这是在本机虚拟的情况下
- 测试一下能够展示
- 进行公网域名解析
主机记录填写*这个是泛解析,前缀不管是啥都行
- 再ping一下公网域名
- 域名解析相关企业项目实战技术架构
- 多用户二级域名
比如说淘宝或者微博的二级域名系统,商家申请店铺的时候会生成一个网址,lsj.taobao.com,然后nginx通过反向代理到java后台的业务逻辑,通过查询数据库(查询域名前缀lsj),然后返回信息给nginx,然后返回给客户端
- 多用户二级域名
- 短网址
肯定有一个短网址运维的系统,用户访问一个短网址 dwz.cn/asdhaksd2456,先提交一个真实地址存到数据库里,再经过系统返回一个短网址,可以用UUID作为key,真实的网址作为value,存到数据库里面,nginx作为请求打到这个系统里面,取到后面的那个字符串进行数据库查询,然后通过redirect转向
- httpdns
- Nginx中的虚拟主机域名配置
- 进行不同域名地址对应的资源配置
- 创建好资源之后,就去nginx.conf改配置
#需要注意,端口号+域名是唯一的就行
#虚拟主机01
server {
listen 80;
server_name localhost;
#前面没有/,就是相对路径,相对于nginx的安装目录
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#虚拟主机02
server {
listen 80;
server_name video.lovelsj.com;
#没有从根目录开始就是相对路径,从根目录开始就是绝对路径: /www/video;
location / {
root /www/video;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#虚拟主机03
server {
listen 80;
server_name pic.lovelsj.com;
#没有从根目录开始就是相对路径,从根目录开始就是绝对路径: /www/pic;
location / {
root /www/pic;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
- 随后我们访问
- www.lovelsj.com
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tNKV0Ful-1656209981199)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f39bf796bebe4b50b4ddd86e79bf6971~tplv-k3u1fbpfcp-watermark.image?)]
2. video.lovelsj.com
3. pic.lovelsjcom
ServerName匹配规则
- 我们可以再同一servername中匹配多个域名
- 在server_name后面写域名加一个空格在写一个域名即可
- 完整匹配
- 他会从头到尾去匹配,第一个匹配上了就不会往后去匹配上,从虚拟主机01-03
- 通配符匹配
- 我们可以在server_name后面加一个 *.lovelsj.com
- 还有正则表达匹配
反向代理----高性能
- 网关、代理和反向代理
反向代理流程图,后端服务器只能往外传数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FYfZnIvF-1656209981200)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4e5d079e7765475bb8d457306b2f0d12~tplv-k3u1fbpfcp-watermark.image?)]
-
反向代理再系统架构中的应用场景
nginx做请求中转 -
Nginx的反向代理配置
- 关键字proxy_pass
proxy_pass 和root目录是二选一的,只要写了proxy_pass,那么就不会去执行root
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FDID0Sez-1656209981200)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f47195e648474d75b9f91be3792b9a83~tplv-k3u1fbpfcp-watermark.image?)]
- 基于反向代理的负载均衡器
upstream定义一组服务器,这个和server是同一级别的
- 负载均衡策略
-
故障转移
nginx后面有许多业务服务器,负载均衡就是有一台服务器不可用了,就可以吧故障转移,另一台服务器提供的服务与第一台的服务相同,需要被负载均衡的服务器焦作服务器的集群,全都服务都一样,当用户请求数据的时候,nginx反向代理给集群的每一台服务器这种负载均衡叫做(轮询,但是无法保持会话) -
权重(weight)
比例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D5VBWjBK-1656209981200)(https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c219342ee4a9496ab9c86e75c260ca5d~tplv-k3u1fbpfcp-watermark.image?)]
- down是不参与负载均衡,让他休息一会,让他下线
- backup是正常使用不用他,因为是备用机,当没有机器用的时候,那么就用备用机
下面是不太常用的负载均衡策略
动静分离
- 使用动静分离场景
- 动静分离原理
- Nginx动静分离配置
URL-Rewrite
Https证书配置
首先http端口是80,https端口是443
- 不安全的Http协议
- Https原理
- CA机构
- 证书
- 客户端(浏览器)
- 服务器端
HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
- 在线证书申请
点击下载
一共两个,一个是pem,一个是key,证书和私钥
- 证书样例
- 我的证书安装文件,要把证书和密钥放到conf文件夹里面,然后用相对路径去找,也可以放到别的地方去用绝对路径查找
我们弄好之后一般重启会报错,那是因为nginx默认没有安装openssl,我们需要重新安装openssl
- 先找到当初解压nginx的目录,然后xshell进入该目录输入ls
- 随后输入命令安装openssl,注意安装的目录,可能需要依赖openssl
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
#依赖
yum -y install pcre-devel openssl openssl-devel
- 随后make,make之后进行备份,退出nginx,覆盖之前nginx,然后查看版本确认一下
- 网址输入确认
下周复习并发和多线程