nginx
测试看看安装是否成功:
cd /data/nginx
cd sbin
./nginx(启动nginx)
查看ngxin服务器状态:
netstat -nplt
随后我们虚拟机关闭防火墙保证能够访问,浏览器输入请求:
192.168.231.128显示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sS0oRMnD-1682215252720)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222180714698.png)]
nexin主要配置:
实战-部署前后分离项目
搭建后端工程:
创建springboot工程,再写个controller:
@RestController
public class NginxController implements ApplicationListener<WebServerInitializedEvent> {
private int port;
@Override
public void onApplicationEvent(WebServerInitializedEvent event) {
this.port = event.getWebServer().getPort();
}
@GetMapping("host")
public String getHost(HttpServletRequest request){
InetAddress address;
try {
address = InetAddress.getLocalHost();
return address.getHostAddress() + ":" + port;
} catch (UnknownHostException e) {
e.printStackTrace();
}
return "error:Network card information is not available!";
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xQr7QS9U-1682215252721)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222194719737.png)]
运行主启动类后,再前端输入请求:http://localhost:8080/host
显示出运行的ip端口:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xfA0L6N5-1682215252722)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222194735066.png)]
使用vue图形化界面创建前端工程:
在桌面建立nginx文件夹在该文件夹建立cgboy-ui文件夹,打开该文件夹,cmd进入黑窗口,输入vue ui
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iOE9LxCg-1682215252722)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222195559039.png)]
随后我们浏览器弹出一个新的界面:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yzmL4Dsi-1682215252722)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222195610929.png)]
点击创建,点击下一步,选vue3
创建成功后,使用vscode打开文件夹:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5VGBigrn-1682215252722)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222201504193.png)]
随后在vscode终端输入指令yarn add axios 安装axios,使用axios发送请求拿到值后传给host
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QeeM9wih-1682215252722)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222204557946.png)]
npm run serve启动
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-alXs9uNu-1682215252723)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222202249731.png)]
前端页面:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Akr4Keie-1682215252723)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222202303523.png)]
此时因为axiox发送的是80端口,前端服务器发送的是81端口,会产生跨域问题,所以解决跨域问题:
添加配置项,新建vue.config.js
位置文件,配置代理如下:
module.exports = {
devServer: {
port: 80,
proxy: 'http://127.0.0.1:8080'
}
}
同时修改axiso的请求地址:
mounted(){
var ip_addr = document.location.hostname
axios.get('http://'+ip_addr+'/host').then(res=>{
this.host = res.data
})
}
再次访问前端工程,发现跨域问题解决:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oMrO3GJW-1682215252723)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222204729415.png)]
nginx做静态服务器:
在linxu中找到nginx的html文件,删除里面的html文件。
随后我们在vscode输入指令:npm run build 下载前端的一些组件到了我们的文件夹中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hDmxnCXz-1682215252723)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222205024196.png)]
将这些文件拖拽到linxu的nginx的html文件夹中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fmnhri2M-1682215252723)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222205054937.png)]
随后我们访问linxu中的nginx的请求:http://192.168.231.128/显示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QobMHtUX-1682215252724)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222205211188.png)]
启动nginx:./nginx
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-47PZKYgZ-1682215252724)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222205244174.png)]
我们在配置文件修改为根目录扫描的路径为/data/www:
随后在data文件夹下建立www文件夹,将vue的dist下的文件拖拽到www中:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vvxj72yY-1682215252724)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222205621316.png)]
关闭nginx:./nginx -s -stop 或者./nginx -s quit(更推荐)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M5NyCu6K-1682215252724)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222205659123.png)]
检查nginx的配置有没有问题: ./nginx -t
启动nginx:./nginx
然后重新加载配置文件:./nginx -s reload
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rcTpPAPy-1682215252724)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222205737068.png)]
location配置:
location通常用来匹配uri,其基本语法如下:
location [=|~|~*|^~] /uri/ {}
(1)=表示匹配uri时必须做到完全匹配,如
location = /index {}
(2)~表示匹配URI时是字母大小写敏感的,可以使用正则表达式。
(3)~*表示匹配URI时是忽略字母大小敏感的,可以使用正则表达式。
(4)^~表示匹配uri时只需满足前缀匹配即可
# 所有 /./img/开头的uri会全部匹配
location ^~ /./img/ {}
(5)uri参数中是可以使用正则表达式的,如匹配以 .gif .jpg和.jpeg结尾的uri,如下:
location ~* \.(gif|jpg|jpeg)$ {}
(6)以下方式可以匹配所有的uri
location / {}
(7)@
指定一个命名的location,一般用于内部重定义请求:
location @name {…}
结果总结: 匹配的优先顺序,=
>^~
(匹配固定字符串,忽略正则)>~*
>/
,工作中尽量将‘=’放在前面。
文件路径的定义
(1)以root方式设置资源路径
语法 root path ,默认 root html,可以在http、server、location模块中配置。
location ^~ /backend {
root /data/www/backend
}
如果url为 /backend/index/test.html
则会返回/data/www/backend/backend/index/test.html这个文件。
(2)以alias方式设置资源路径
alias也是用来设置文件资源的,它和root不同点在于如何解读紧跟location后面的uri参数,可以在location中配置:
location ^~ /backend {
alias /data/www/backend
}
如果url为 /backend/index/test.html
则会返回/data/www/backend/index/test.html文件。
alias会将location后的url部分丢弃掉,而root不会。
(3)访问首页
可以在http、server、location中配置。
index index.html index.htm index.php
nginx会依次访问index中定义的文件,知道访问成功为止。
(4)根据http返回码重定向页面
可以在http、server、location中配置。
error_page 404 /404.html
error_page 502 503 504 /50x.html
(5)try_files
try_files path1 path2 ... uri
该配置项可以配置在server、location模块。
try_files后边会跟若干路径,nginx会尝试按照顺序访问每一个path,如果可以有效的读取,就直接访问当下path资源,否则继续向下访问,如果都读取不到就重定向到uri参数上
try_files /a/b.html $uri $uri/index.html $uri.html @other;
location @other {
proxy_pass http://backend
}
vue工程配置:
在nginx.conf配置文件配置所有的请求都会匹配到data下的www/ui下的index.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lGSYieg5-1682215252724)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221222213851072.png)]
点击about切换:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JNscH7tM-1682215252725)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670504453438.png)]
但是如果我们输入该about页面的请求:http://192.168.58.128/about
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GiEZaMCW-1682215252725)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670504483917.png)]
这是因为这个请求特定先data下的www/ui下的找叫about.html,发送请求后,找不到报错。但是如果输入http://192.168.58.128,发送请求后,会直接去data下的www/ui下的主页面index.html,而在index.html有路由可以跳转到about。
所以我们进行配置在输入请求类似http://192.168.58.128/about的情况也能出现页面:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mRn8scf2-1682215252725)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670506749428.png)]
所有请求都能匹配,且先找uri,找不到找uri/,找不到找uri/index.html,,,后续一次类推,如果最后都找不到才回去去ui下的index.html
注意使用此配置时 location / {}只能有一个,将上面哪个注释掉:
此时我们输入请求:http://192.168.58.128/about:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TfYZysBs-1682215252725)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670505411575.png)]
对图片开启gzip压缩:
给nginx.conf文件添加如下配置
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 5;
gzip_types image/png;
gzip_vary on;
解释如下:
- gzip on;使用"gzip on;"参数来启用压缩,默认是关闭的。
- gzip_min_length 1k;gzip压缩的最小文件,小于设置值的文件将不会压缩#指定Nginx服务需要向服务器申请的缓存空间的个数*大小,默认32 4k|16 8k;
- gzip_buffers 4 16k;设置压缩缓冲区大小,此处设置为4个16K内存作为压缩结果流缓存
- gzip_http_version 1.1;启用压缩功能时,协议的最小版本,默认HTTP/1.1
- gzip_comp_level 5;压缩比例由低到高从1到9,默认为1。但需要注意的是压缩比设置的越高就会越消耗CPU的资源,因此在生产环境中我们会设置该参数的值在3~5之间,最好不要超过5,因为随着压缩比的增大的确会降低传输的带宽成本但发送数据前会占用更多的CPU时间分片。
- gzip_types image/png;指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错。
- gzip_vary on;该指令用于设置在使用Gzip功能时是否发送带有“Vary: Accept-Encoding”头域的响应头部。该头域的主要功能是告诉接收方发送的数据经过了压缩处理。开启后的效果是在响应头部添加了Accept-Encoding: gzip,这对于本身不支持Gzip压缩的客户端浏览器是有用的。
这一次没有设置图片压缩:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UFnNMO1u-1682215253131)(null)]
设置图片压缩后,响应多了如下的首部信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5JVTVfF6-1682215253116)(null)]
解决当前前端工程访问对应的后端的跨域问题:
我们先将后端的springboot打包成 jar包发送到linxu中,然后在linxu中用java启动该后端程序,
启动后,随后在nginx配置文件中配置代理
现在我们想的是将前端发送的以api打头的url全部代理到,后端8080端口:
前端访问的接口:http://127.0.0.1:80/api/host
后端的接口:http://127.0.0.1:80/host
在实现代理的过程中,我们需要将/api这个前缀删除掉,将来拦截到所有以api为前缀的请求,全部都会去访问127.0.0.1:8080:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5T7RBIxy-1682215252726)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221223004437430.png)]
重新加载配置文件后:输入请求:http://192.168.58.128/,然后跨域代理访问了后端服务器localhost:8080
实现后端负载均衡:
让负载均衡到各个服务器上,有时候,我们的后端工程压力太大,可能需要将后端工程部署在多台服务器上,此时就需要nginx使用负载均衡了,在学习负载均衡的时候我们不妨先了解一下upstream模块。
upstream(上游服务器)模块解读:
nginx 的负载均衡功能依赖于 ngx_http_upstream_module模块。upstream 模块应该放于http{}标签内。
模块写法如下:
upstream backend {
ip_hash; //通过对ip进行hash算法分发给下面对应服务器的方式
server backend1.example.com;
server backend2.example.com:8080;
server 127.0.0.1:8080;
server backup2.example.com:8080;
}
然后在location处使用如下写法:
location / {
proxy_pass http://backend;
}
ngixn负载均衡的五种算法
(1)round robin 轮询 (默认) 按时间顺序依次将请求分配到各个后台服务器中,挂掉的服务器自动从列表中剔除
upstream bakend {
server 192.168.0.1 down;
server 192.168.0.2;
}
(2)weight 轮询权重 weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下,或在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。
upstream bakend {
server 192.168.0.1 weight=20;
server 192.168.0.2 weight=10;
}
(3)ip_hash:每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。
upstream bakend {
ip_hash;
server 192.168.0.1:88;
server 192.168.0.2:80;
}
(4)url_hash:按访问的URL的哈希结果来分配请求,使每个URL定向到同一台后端服务器,可以进一步提高后端服务器缓存的效率。Nginx本身不支持url_hash,需要安装Nginx的hash软件包。
upstream backend {
server 192.168.0.1:88; //使用hash语句时,不能在使用weight等其他参数
server 192.168.0.2:80;
hash $request_uri;
hash_method crc32; //使用hash算法
}
(5)fair算法:可以根据页面大小和加载时间长短智能地进行负载均衡,根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身不支持fair,要安装upstream_fair模块才能使用。
upstream backend {
server 192.168.0.1:88;
server 192.168.0.2:80;
fair;
}
项目配置:
首先我们再开启一台服务器,再8081端口运行:java -jar nginx.jar --server.port=8081
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ECY0XYVn-1682215252726)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221223003601294.png)]
修改nginx配置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7Zpt6Z6-1682215252726)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221223003055625.png)]
重新加载配置后,输入请求:http://192.168.58.128/:
匹配规则默认使用轮询
我们刷新:
)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J0ynvwT4-1682215252726)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221223004609404.png)]
再刷新:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JIBEscqP-1682215252726)(C:\Users\陈刚\AppData\Roaming\Typora\typora-user-images\image-20221223004615192.png)]
说明我们每次发送的请求会分发到了不同的服务器上。
正向代理:
客户端知道目标服务器的ip端口,但是不能直接去访问,所以发送请求给代理服务器,代理服务器将客户端的请求发送给目标服务器,拿到结果返回客户端
反向代理:
客户端不知道目标服务器的端口,那么客户端只能访问代理服务器,代理服务器反向将客户端请求代理到目标服务器。
解决其他工程访问nginx的跨域问题:
当有其他的外部的工程跨域访问nginx服务器时,配置文件修改:
location ^~ /api/ {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow_Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'Authorization,Accept,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH';
proxy_pass http://cgboy/;
}
监控功能实现
配置文件加入:
#设定查看Nginx状态的地址
location = /status {
stub_status on; #表示开启stubStatus的工作状态统计功能。
}
重新加载配置文件后:输入请求:http://192.168.58.128/status
显示:
如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LEbm13Zm-1682215252727)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670568708619.png)]
列出目录 autoindex
Nginx默认是不允许列出整个目录的。如需此功能,打开nginx.conf文件,在location,server 或 http段中加入如下参数:这个功能我们可以做一个资源下载站。
location ^~ /file {
root /data/www;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
charset utf-8,gbk;
}
之后输入请求http://192.168.58.128/file
autoindex on;
运行列出目录内容。另外两个参数最好也加上去。autoindex_exact_size off;
默认为on,显示出文件的确切大小,单位是bytes。改为off后,显示出文件的大概大小,单位是kB或者MB或者GB。autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间。
已知我们www/file下的文件信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UgnZGMI0-1682215252727)(C:\Users\CG\AppData\Roaming\Typora\typora-user-images\1670570297847.png)]
需此功能,打开nginx.conf文件,在location,server 或 http段中加入如下参数:这个功能我们可以做一个资源下载站。
location ^~ /file {
root /data/www;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
charset utf-8,gbk;
}
之后输入请求http://192.168.58.128/file
autoindex on;
运行列出目录内容。另外两个参数最好也加上去。autoindex_exact_size off;
默认为on,显示出文件的确切大小,单位是bytes。改为off后,显示出文件的大概大小,单位是kB或者MB或者GB。autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间。
已知我们www/file下的文件信息:
[外链图片转存中…(img-UgnZGMI0-1682215252727)]