1.下载安装
ubuntu20.4基于系统
//更新包源
sudo apt update
//直接安装
sudo apt install nginx
//启动
sudo systemctl start nginx
sudo systemctl enable nginx
//重启
sudo service nginx restart
sudo systemctl restart nginx
//配置防火墙
sudo ufw allow 80/tcp
443是https
win
启动直接双击nginx.exe文件
win下必须用杀死所有进程命令或去任务管理器里结束nginx进程树
taskkill /IM nginx.exe /F
2.nginx简介
2.1 作为web服务器
nginx可以处理静态或者动态页面
当处理静态页面时,nginx.conf配置如下
server {
listen 80;
server_name example.com;
root /var/www/html; # 静态文件的根目录
location / {
try_files $uri $uri/ /index.html;
}
}
当处理动态页面时就需要把请求转发到后端服务器
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:8080; # 将请求转发到后端服务器
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
2.2 作为反向代理服务器
作为反向代理服务器,通过配置多个后端服务器实现负载均衡。
upstream backend {
server 192.168.1.50;
server 192.168.1.51;
server 192.168.1.52;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
反向代理就是接受客户端的请求然后再由nginx转给后端服务器,多了个中间商
目的就是为了隐藏后端服务器地址,过nginx隐藏真实的端口,增加安全性
比如通过代理来连接mysql
stream {
upstream mysql {
server ******:3306; #后端数据库的ip和端口,如果进行了域名解析,直接写域名就好
}
server {
listen 3307; #如果监听3306,远程登录的时候不用加-p参数
proxy_connect_timeout 10s;
proxy_timeout 30s;
proxy_pass mysql;
}
}
要注意的是因为mysq属于tcp连接,而我们默认的mysql.conf配置文件里是基于http请求的,要基于tcp连接需要建一个stream块,stream和http是平级的
2.3 反向代理缓存
nginx也可以缓存经过它的请求响应
通过配置缓存策略和有效期,可以在接收到请求时直接从缓存中返回响应,就不用向后端服务器请求数据了
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_servers;
proxy_cache my_cache;
proxy_cache_valid 200 304 10m;
}
}
2.4 Web应用防火墙
通过配置HTTP模块和相关的安全策略,Nginx可以充当Web应用防火墙,对来自客户端的请求进行过滤和检查,防范SQL注入、跨站脚本(XSS)等常见的Web攻击。
3.关于nginx配置文件遇到的坑以及补充
3.1alias和root(区别在后面)
1.使用root来获取动态静态资源时,location后面不能有前缀,不然会拼到给定的文件地址后面,导致路径识别不到,
解决办法:
1.直接使用 / 不要加任何名称
2.如果所有的前端项目需要在一个端口下的话,就只能使用这种方案了-----因为root是绝对路径,所有的location /后面的名称都会拼到root 目录后面,所以在 / 后加具体的存在的文件名称也可以完成
3.使用alias 去指定静态动态目录
不要试图去试图使用^~ 或者 rewrite方式,经测无数次无效
//错误示范
location /qq {
root E:/nginx-1.25.5/html/dist/dist2/; # 使用 root 指令
index inde.html; # 指定默认索引文件
}
//正确
location /dist2 {
root E:/nginx-1.25.5/html/dist/; # 使用 root 指令
index inde.html; # 指定默认索引文件
}
2.如果需要前缀来区分前端项目就使用alias这个来标识路径
使用这个时location后的前缀不会被拼接到目录上的他会在当前文件目录下找指定的index.html页面
//正确
location /qq {
alias E:/nginx-1.25.5/html/dist/dist/;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
location /bb {
alias E:/nginx-1.25.5/html/dist/dist1/;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
区别:
root 指令用于定义请求的根目录。nginx会将请求的url附加到root指令指定的路径上,以构建文件系统的路径。
alias 指令也用于定义请求的根目录,但它不会将请求的URI附加到指定的路径上。相反,它使用指定的路径替换URI中的位置部分。
使用场景
当你的目录结构和URL结构一致时,使用root。
当你的目录结构和URL结构不一致时,使用alias。
3.2通过nginx反向代理连接服务 配置后端接口
配置后端接口最重要的属性 proxy_pass 指定服务器的地址
location /qq {
rewrite ^/lc(.*) $1 break;
proxy_pass http://127.0.0.1:8080;
}
如果qq不是后端接口路径的话,就可以使用rewrite重写规则,不重写的话就会试/qq拼接到8080后,地址都错了,会导致访问接口失败
通常情况下/后面就是接口的路径前缀
一个典型的nginx代理配置
server {
listen 81;
server_name location;
location / {
root /soft/apache-tomcat-7.0.77/jsdwebapps/webapps/test; # 网站根目录 ,存放dist文件里的内容
index index.html index.htm;
try_files $uri $uri/ /index.html; # 防止页面刷新出现404
}
location /api{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8899;
}
}
server {
listen 82;
server_name location;
location / {
root /soft/apache-tomcat-7.0.77/jsdwebapps/webapps/ruoyi_vue; # 网站根目录 ,存放dist文件里的内容
index index.html index.htm;
try_files $uri $uri/ /index.html; # 防止页面刷新出现404
}
location /prod-api/{
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8080/;
}
}
3.3允许不同的前端项目使用不同的端口时就配置多个服务server,去监听不同的端口
server {
listen 8083;
server_name 127.0.0.1;
location /qq/ {
alias E:/nginx-1.25.5/html/dist/dist1/; # 使用 root 指令
index inde.html; # 指定默认索引文件
}
server {
listen 8084;
server_name 127.0.0.1;
location /qq/ {
alias E:/nginx-1.25.5/html/dist/dist2/; # 使用 root 指令
index inde.html; # 指定默认索引文件
}
2024.7.6
4.nginx搭配minio来实现访问远程服务器上的静态资源
如果需求是这样的:nginx反向代理可以直接代理远程服务器上的后端接口,但是无法直接调用远程服务器上的前端资源,因为服务器本身并不能够直接通过http来访问文件,后端可以直接访问接口是因为有Tomcat,远程服务器上没有nginx,但是前端资源要部署在远程服务器上,通过另一台有nginx的服务器去访问资源,这个时候就需要一个支持http访问文件的工具,因为minio底层是go语言实现的,它使用了go语言的标准库net/http来实现http服务器功能,所以可以通过将文件上传到minio服务上,再去通过nginx去反向代理minio下的文件地址,以达到访问静态资源的目的
server {
listen 8083;
server_name 127.0.0.1;
location /qq {
proxy_pass http://**:**:**:**:9000/test/dist2/inde.html;
}
}
关于nginx配置中server_name解释:server_name要写本机的服务地址,不能写远程服务器地址,是通过它来识别本机的
------------------------------------------------------------------
总结,nginx配置文件有些出错了都不会提示,会遇到很多大大小小的坑,需要去看log
win下就在nginx/log/error.log
linux就在/var/log/nginx
要搞清楚地址后加/和不加/的区别访问的文件目录还是具体的文件
location后一定不能重复
常见的错误:
浏览器:404必是地址访问错误
duplicate location:location配置重复
is not found (3: The system cannot find the path specified), client 和 CreateFile() "E:\nginx-1.25.5/html/qb" failed (2: The system cannot find the file specified) :资源路径错误
connect() failed (10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond) while connecting to upstream:后端地址错误导致nginx连接失败