下面是nginx的基本使用。原理以后再学。未完待续。。。
一、nginx环境搭建
1、nginx运行环境-虚拟机联网
创建虚拟机的步骤就不再说了。创建完成之后,如何使虚拟机联网。
ip addr
查看虚拟机的网卡配置
lo即本地回环,ens33即虚拟出来的网卡,但是还没有IP地址。
vi /etc/sysconfig/network-scripts/ifcfg-ens33
下图说明这个IP地址是采取dhcp协议分配的,将会被随机分配,并且每次联网IP地址都可能不同。
systemctl restart network
现在虚拟机就有IP地址了192.168.4.129
现在使用xshell连接这台虚拟机
2、配置静态IP地址
之前的网络配置是使用dhcp方式分配ip地址,这种方式会在系统每次联网的时候分配一个ip给我们用,也就是说有可能系统下次启动的时候ip会变,这样非常不方便我们管理。
DNS服务器配置的是阿里云的DNS解析服务器。
到现在,虚拟机就可以联网了。
3、下载nginx
http://nginx.org/en/download.html
官网下载tar.gz压缩包。选择Mainline version
版本的中间那个。使用FTP工具将文件上传到虚拟机中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| tar -zxvf nginx-1.21.6.tar.gz cd nginx-1.21.6
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
./configure --prefix=/usr/local/nginx make make install
cd /usr/local/nginx/sbin ls ./nginx
|
nginx其他命令(在sbin目录下)
1 2 3 4
| ./nginx -s stop #快速停止 ./nginx -s quit #完成已接受的请求后,停止 ./nginx -s reload #重新加载配置 ./nginx -t #检查nginx配置是否正确
|
配置nginx服务器开机自启动
1 2 3 4 5 6
| #查看nginx状态 ps -ef|grep nginx #快速停止 ./nginx -s stop systemctl start nginx systemctl status nginx
|
注册系统服务
通过系统服务的方式启动nginx
1
| vi usr/lib/systemd/system/nginx.service
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| [Unit] Description=nginx 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 # 多用户
|
1
| systemctl enable nginx.service #启动
|
关闭防火墙
1
| systemctl stop firewalld
|
二、nginx目录结构
1 2 3 4 5 6 7 8 9 10 11
| conf #配置文件 |-nginx.conf # 主配置文件 |-其他配置文件,会被引入到了nginx.conf html #静态页面 logs |-access.log #访问日志(每次访问都会记录) |-error.log #错误日志 |-nginx.pid #进程号 sbin |-nginx #主进程文件 *_temp #运行时,生成临时文件
|
1、nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| worker_processes 1; # 启动的worker进程数,一般与主机的CPU个数相同
events { worker_connections 1024; #每个worker进程的最大连接数 }
http { include mime.types;#include是引入关键字,可以引入相同目录下的文件,mime.types是用来定义,请求返回的content-type) default_type application/octet-stream;#mime.types未定义的,使用默认格式application/octet-stream
sendfile on;
keepalive_timeout 65; #长链接超时时间
#多个域名被解析到同一个服务器上,用nginx来分配显示的首页,servername就是不同的域名 server { listen 80; #监听端口80 server_name localhost; #接收的域名 location / { root html; #根目录指向html目录 index index.html index.htm; #http://域名/index 指向 index.html index.htm文件 }
error_page 500 502 503 504 /50x.html;# 服务器错误码为500 502 503 504,转到"域名/50x.html" location = /50x.html { root html; } }
}
|
修改完配置文件后,需要重启nginx
1、server_name匹配规则
可以在同一个server_name中配置多个域名。中间用空格隔开。
匹配方式:
- 完整匹配。
server_name haha.cn huhu.cn;
- 通配符匹配。
server_name *.haha.cn;
说明sdaidj.haha.cn都会配匹配到这个域名。精确匹配的优先级大于通配符匹配和正则匹配。
- 通配符结束匹配。
server_name www.xzj520520.*;
- 正则匹配。即域名可以写成正则表达式。正则匹配格式,必须以
~
开头,比如:server_name ~^www\d+\.example\.net$;
。如果开头没有~
,则nginx认为是精确匹配。
- 特殊匹配。
server_name "";
匹配Host请求头不存在的情况。
三、基本使用
1、配置内网域名
配置内网域名,暂时先不配置公网域名。
本机要想能解析这个域名,需要在C:\Windows\System32\drivers\etc
中的hosts文件中添加域名的对应信息,其实这个文件也相当于本机的DNS服务器的功能,本地去解析这个域名时首先会看hosts文件中有没有对应IP地址,如果没有,才会继续往上层的DNS服务器去查询。
192.168.4.101 vickkkyz.com
这样访问vickkkyz.com
就可以指定到这个IP地址了,然后nginx会将其转到index.html
注意:这个域名只有在这个主机上才可以转成这个IP地址,换一个主机就不可以了。
2、配置虚拟主机
可以配置不同域名,同一个IP地址。也可以配置不同端口号。
配置不同域名:
现在给192.168.4.101
配置两个域名。
192.168.4.101 abc.vickkkyz.com
192.168.4.101 def.vickkkyz.com
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| server { listen 80; server_name abc.vickkkyz.com;
location / { root /www/test01; index index.html index.htm; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
server { listen 80; server_name def.vickkkyz.com;
location / { root /www/test02; index index.html index.htm; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
|
同理,也可以根据访问不通过端口号,来显示不同的资源。
我发现如果现在还有一个域名对应这个IP地址,但是现在nginx.conf文件中server没有配置,那么会直接匹配第一个server中配置的页面。
3、反向代理
代理:nginx帮用户把请求传到指定的业务服务器上,比如Tomcat服务器,即代理用户发送用户的请求。
反向代理:即用户不能直接访问到tomcat服务器,所以作为服务器方,提供了nginx供用户来访问,就类似于提供一个访问接口。因为是服务器端提供的,所以是反向代理。
有性能瓶颈,因为所有的数据都经过Nginx,所以Nginx服务器的性能至关重要。
nginx将请求转发给指定服务器,服务器返回的数据再返回给nginx,由nginx返回给用户。或者是服务器直接返回给用户。
需要在配置文件中加一个proxy_pass
字段,后面的值是你要让nginx代理的地址(具体的网址),可以写多个。一旦加上这个字段,location中的root和index就失效了。
下面是ngin01的nginx.conf的部分配置文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| server { listen 80; server_name abc.vickkkyz.com;
location / { #代理到 http://192.168.4.102,不支持https proxy_pass http://192.168.4.102; root /www/test01; index index.html index.htm; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
}
|
4、负载均衡
把请求,按照一定算法规则,分配给多台业务服务器(即使其中一个坏了/维护升级,还有其他服务器可以继续提供服务)
负载均衡的算法:
- 轮询。请求到来后按顺序选择服务器。如果选中的服务器故障,会启动retry机制,尝试分配给下一个服务器。
- 配置权重。
5、反向代理+负载均衡
同一个域名的反向代理,配置多组服务器域名。**需要定义地址别名 **
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| upstream httpds{ server 192.168.4.102:80; #如果是80端口,可以省略不写 server 192.168.4.103:80; }
server { listen 80; server_name abc.vickkkyz.com;
location / { proxy_pass http://httpds; root /www/test01; index index.html index.htm; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
}
|
weight配置服务器的不同权重。
1 2 3 4
| upstream httpds{ server 192.168.4.102:80 weight=6; #如果是80端口,可以省略不写 server 192.168.4.103:80 weight=2; }
|
down让某些服务器不参与负载均衡。
1 2 3 4
| upstream httpds{ server 192.168.4.102:80 weight=6 down; server 192.168.4.103:80 weight=2; }
|
backup配置配用服务器,正常情况不会负载到这个服务器,当没有服务器可以负载时,才会使用这个备用服务器。
1 2 3 4
| upstream httpds{ server 192.168.4.102:80 weight=6 backup; server 192.168.4.103:80 weight=2; }
|
6、动静分离
原来,当用户请求时,请求通过nginx转发到某个tomcat服务器,然后tomcat服务器将响应资源返回给nginx,nginx再返回给用户,而对于静态资源,比如图片,js,css,如果需要经常访问,那每次都需要tomcat返回,这样比较影响性能。考虑将静态资源放到nginx中,这样静态资源就不用经过那么多链路了。
即当用户请求时,动态请求分配到Tomcat业务服务器,静态资源请求放在Nginx服务器中。
也就是让nginx可以找到这些静态文件。
- 如果请求的资源地址是
location/css/*
,就会被匹配到nginx的html目录下的css文件夹中(我们把css静态资源放在这个位置)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| server { listen 80; server_name localhost; location / { # /的优先级比较低,如果下面的location没匹配到,就会走http://xxx这个地址的机器 proxy_pass http://xxx; } location /css { # root指的是html,location/css指的是root下的css,所以地址就是html/css # root目录是:/usr/local/nginx root html; index index.html index.htm; }
error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
|
使用正则可以同时配置多个静态资源目录
1 2 3 4
| location ~*/(js|css|img){ root html; index index.html index.htm; }
|
URL重写,使用正则,就是动态匹配url再重定向。
假设当前主机的IP地址为192.168.4.101
,如果现在访问http://192.168.4.101/2.html
则会被重定向到http://192.168.4.101//index.jsp?pageNum=$1
目的是隐藏uri中的重要信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| server { listen 80; server_name localhost;#localhost表示请求的域名是这个或请求的IP地址的域名是这个 location / { rewrite ^/([0-9]+).html$ /index.jsp?pageNum=$1 break; proxy_pass http://xxx; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
|
1 2 3 4 5 6 7 8 9 10 11 12
| rewrite <regex> <replacement> [flag]; 关键字 正则 替代内容 flagt标记
正则:per1森容正则表达式语句进行规则匹配 替代内容:将正则匹配的内容替换成replacement
flag标记说明: last #本条规则匹配完成后,继续向下匹配新的1ocation URI规则 break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临重定向,游览器地址会显示跳转后的URL地址 permanent #返回301永久重定向,测览器地址栏会显示跳转后的URL地址
|
7、nginx充当网关服务器
当业务中要求tomcat服务器不能被外网访问,用户想要访问其中的资源必须先通过nginx服务器,然后再由nginx服务器将请求转发给tomcat,这时候nginx的作用是反向代理,如果有多个tomcat,nginx还有负载均衡的作用。然后因为tomcat外网不能访问,但是需要被nginx访问,所以需要配置防火墙规则。
启动应用服务器的防火墙,设置其只能接受这台Nginx服务器的请求。
1
| firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.174.135" port protocol="tcp" port="8080" accept" #这里的192.168.174.135是网关 服务器地址
|
这是移除这个规则
1
| firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.174.135" port port="8080" protocol="tcp" accept"
|
移除和添加规则都要重启才能生效
查看所有规则
1
| firewall-cmd --list-all #所有开启的规则
|
8、防盗链
参考:https://heyingjiee.github.io/otherLanguage/Nginx%E5%AD%A6%E4%B9%A0.html#%E9%98%B2%E7%9B%97%E9%93%BE
9、高可用场景
10、配置证书