目录
default_type application/octet-stream
一、Nginx安装
请参考我的另一篇文章:Linux系统安装Nginx(保姆级教程)
二、Nginx基本使用
2.1、目录结构
conf
html
用来存放静态文件的默认目录 html、css等。
logs
access.log:用来记录用户访问日志,将时间、地点、人物三要素都记录下来。由于会记录每个人的每次访问,所以此文件会比较大,但放心,在配置文件中配置了,当文件过大,会往另外一个文件中记录。
error.log:顾名思义,就是记录一些错误的日志。
nginx.pid:里面只有一个pid号,当我们启动Nginx时,pid就是此号。
sbin
Nginx的主程序。
2.2、基本运行原理
第一步:用户发起一个请求。
第二步:Nginx启动后共有两个进程,一个是master主进程,另一个worker子进程,主进程不处理业务,只是协调子进程干活。
第三步:worker读取并解析配置文件/conf/nginx.conf,看用户发的请求能不能映射到配置文件中配置的url,能就直接映射。
2.3、nginx.conf最小配置解析
worker_processes
worker_processes 1; # 默认为1,表示开启一个业务进程
worker_connections
# 单个业务进程可接受连接数
events {
worker_connections 1024;
}
include mime.types
http {
# 引入http mime类型
include mime.types;
default_type application/octet-stream
http {
include mime.types;
# 如果mime类型没匹配上,默认使用二进制流的方式传输
default_type application/octet-stream;
sendfile on
sendfile on; # 使用linux的 sendfile(socket, file, len) 高效网络传输,也就是数据0拷贝。
keepalive_timeout 65
keepalive_timeout 65;
虚拟主机配置
# 主机
server {
listen 80; # 监听端口号
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server{}:代表一个虚拟主机,一个nginx.conf文件可以配置多个主机,互不干扰,可以通过端口号listen的不同来区分。
listen:监听端口。
server_name:主机名,域名。
location:是域名或主机名后跟的uri,比如我nginx.conf配置如下:
# 主机
server {
listen 8080; # 监听端口号
server_name localhost;
api/ {
root html;
index index.html index.htm;
}
}
那前端用户请求的就应该是,http://localhost:8080/api/。
那么请求就会映射到html文件中,这里的html以后我们做项目,会把前端项目编译后的一堆文件放到html文件中,直接就可以访问。
error_page:错误页。
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
假如请求http://localhost:8080/api/userList路径,但是报错了,错误码是500,那么就会跳转到/50x.html,路径就会变成http://localhost:8080/50x.html,但我们没有50x.html,所以会将目录指向nginx/html中的50x.html。
2.4、虚拟主机与域名解析
原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务。
2.4.1、实现域名解析
第一步:复制你本机的hosts文件到桌面,路径是C:\Windows\System32\drivers\etc\hosts
第二步:打开桌面上的hosts文件,输入以下映射关系
你虚拟机的ip地址 www.s1.com
这样做的意思是,给你的IP地址映射一个域名,这样你就可以通过域名来访问nginx了。
第三步:保存并替换C:\Windows\System32\drivers\etc\hosts
第四步:ping www.s1.com
如果有响应就算成功!!!
第五步:在本机浏览器上访问www.s1.com,如果出现nginx页面就算配置映射成功
2.4.2、实现Nginx不同端口访问不同项目
我现在有个需求:我只有一台服务器,但我想输入不同端口号访问不同的项目,刚如何做?
第一步:在nginx/html中创建两个目录,里面分别写上不同的html页,代表两个项目
cd /usr/local/nginx/html
mkdir -p www
mkdir -p void
cd www
vi index.html
cd void
vi index.html
第二步:打开conf/nginx.conf文件,增加主机映射
cd /usr/local/nginx/conf
vi nginx.conf
在html基础上后面加上/www,代表的意思是,当我访问localhost:80就会去html/www文件下找index.html页。
复制进去,现在总共有两个server{},一个端口为80,另一个为88。
保存文件。
第三步:重启nginx
systemctl reload nginx
注意:这里如果重启完不生效,先stop命令停止,再用start命令启动。
第四步:本机访问进行测试
2.4.3、servername匹配规则
完整匹配
我们可以在同一servername中匹配多个域名。
server_name vod.mmban.com www1.mmban.com;
这样不管我们访问vod.mmban.com还是www1.mmban.com,都映射到一台主机上。
通配符匹配
server_name *.mmban.com
通配符结束匹配
server_name vod.*;
正则匹配
server_name ~^[0-9]+\.mmban\.com$;
2.5、反向代理
2.5.1、介绍
用户请求通过互联网打到我们机房网关路由上,路由和nginx是互通的,也就是说,用户请求直接访问nginx中间商,然后nginx转发到应用服务器。
由于Nginx是服务端提供给用户访问的,所以叫反向代理。
2.5.2、实现反向代理
修改配置文件nginx.conf。
proxy_pass http://baidu.com;
意思就是当我访问localhost:80时,直接跳转到百度,但这种域名会变,从 localhost:80变成www.baidu.com,这是因为访问的外网。
如果你代理的是内网地址,比如192.168.X.1代理到192.168.X.2,那域名就不会变。
2.6、负载均衡
2.6.1、实现简单的负载均衡
在nginx.conf配置文件中添加如下代码:
upstream httpd {
server 192.168.44.102:80;
server 192.168.43.103:80;
}
server{
listen 80;
server_name localhost;
location /{
proxy_pass http://httpds; # httpds映射到上面配置的负载均衡名,随意起名
}
}
注意:upstream和server是同级别的,别写到server{}里面。
这样当我们访问localhost:80,第一次代理到192.168.44.102:80,第二次代理到192.168.44.102:80,依次类推,一人一次,雨露均沾。
2.6.2、负载均衡策略
轮询
weight(权重)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream httpd {
server 127.0.0.1:8050 weight=10 down;
server 127.0.0.1:8060 weight=1;
server 127.0.0.1:8060 weight=1 backup;
}
down:表示当前的server暂时不参与负载。
weight:默认为1,weight越大,负载的权重就越大。
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器,意思是备用服务器。
ip_hash
根据客户端的ip地址转发同一台服务器,可以保持会话。像轮询就不会保持会话,比如你在A服务器上登录过,这次轮询到B服务器了,那你就得重新登录。而ip_hash策略,就会根据你用户的ip地址,来定向转到同一台服务器,这样就可以保持会话了。
least_conn
最小连接数访问,这样能保证后端服务器的负载更加均衡。意思就是A服务器连接次数1000次,B服务器才20次,那么就会将剩下的往B上转。
url_hash
根据用户访问的url定向转发请求。
fair
根据后端服务器响应时间转发请求。
注意:ip_hash、least_conn、url_hash、fair这四种基本上在生产环境中不会用,有一个重要的问题,无法做到服务器动态上下线,比如有现在有4台服务器,我想动态下线一台,再上线两台,这个是做不到的。
2.7、动静分离
2.7.1、介绍
如果你是前后分离的项目,这一节就不用看了。
动静分离的意思是,我们单体项目比如SpringBoot,里面有很多html页,必然会引入很多图片、gif图、JS、CSS等静态资源。本来用户请求到Nginx,再代理到Tomcat,那是不是有点浪费资源呢?我们是否可以将静态资源都放到Nginx上,这样就少了一步代理操作。静从Nginx上取,动就直接代理到Tomcat后端服务器,这就叫动静分离。
2.7.2、配置动静分离
location / {
proxy_pass http://127.0.0.1:8080;
}
location /css {
root /usr/local/nginx/static; # 访问static下的css目录
index index.html index.htm;
}
location /images {
root /usr/local/nginx/static; # 访问static下的images目录
index index.html index.htm;
}
location /js {
root /usr/local/nginx/static; # 访问static下的js目录
index index.html index.htm;
}
2.7.3、使用正则配置动静分离
location ~*/(css|img|js) {
root /usr/local/nginx/static;
index index.html index.htm;
}
2.7.4、UrlRewrite
location /{
rewrite ^/2.html$ /index.jsp?pageNum=2 break;
proxy_pass http://192.168.44.104:8080;
}
配置的rewrite意思就是重写url,我们访问localhost:80/2.html其实访问的是localhost:80//index.jsp?pageNum=2。其实压根就没有2.html,配置文件只要匹配上就行。
flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则。
break #本条规则匹配完成即终止,不再匹配后面的任何规则。
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
2.8、高可用配置
2.8.1、Keepalived
这东西有点像Redis的哨兵模式,当每一台Nginx配备一个Keepalived,每个Keepalived是互通的,假如A服务器上的Nginx宕机了,通过Keepalived就可以将请求都转到B服务器的Nginx。