nginx配置文件
- nginx配置文件位置
- nginx配置文件组成
- (1)全局块
- (2)events块
- (3)http块
- 反向代理 案例
- 负载均衡 案例
- 负载均衡策略
- 轮询
- 权重
- ip_hash
- 动静分离
- 动态资源代理
- 静态资源代理
nginx配置文件位置
/usr/local/nginx/conf/nginx.conf
nginx配置文件组成
(1)全局块
从配置文件开始到events块之间的内容,主要是设置一些影响nginx服务器整体运行的配置指令。
比如:
worker_processes 1;
worker_processes 值越大,可以支持的并发处理量越多,worker进程越多
error_log 代表nginx错误日志存放路径
(2)events块
events块涉及的指令主要影响nginx服务器与用户的网络连接
比如:
worker_connections 1024; 支持的最大连接数
(3)http块
http块又分为http全局块和server块
http全局块:
include main.types; 引入一个外部的的文件->/main.types中放着大量的的媒体类型
include vhosts/*.conf; 引入一个外部的的文件->引入vhosts文件下,以.conf结尾的配置文件
server块:
listent: 80;监听89端口
location块
root:/web/abc;将接受到的请求到指定目录下请求资源。
index:index.html ; 默认去上述的路径中去查找相对于的文件
server块是重点,主要是各种域名、项目的配置,可以做反向代理等操作
反向代理 案例
在server中,把server_name改成当前具体的IP地址,然后在location中增加一项proxy_pass,把具体要代理到的服务器ip及端口号写进去,等客户端向nginx服务器的80端口发起请求后,就可以直接代理到我们指定的反向代理服务器
// 把当前IP的80端口反向代理到当前IP的8080端口
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
具体Nginx的location路径映射
#优先级关系(越精确,优先级越高)
(location =) > (location /xxx/zzz/vvv) > (location ^~) > (location ~,~*) > (location /)
#1. = 匹配
location =/ {
#精准匹配,主机名后面不能带任何的的字符串
}
#2. 通用匹配
location /xxx {
#匹配所有以xxx开头的路径
}
#3. 正则匹配
location ~ /xxx {
# 匹配所有以xxx开头的路径
}
#4. 匹配开头路径
location ^~ /xxx {
# 匹配所有以xxx开头的路径
}
#5. ~* \.(gif|jpg|png)$ {
# 匹配以gif或者jpg或者png结尾的路径
}
负载均衡 案例
在http全局块中增加upstream部分,把需要负载均衡的服务器全部加进去,可以加一些规则,比如优先级顺序等。
然后在在serve块中用proxy_pass指定该负载均衡的名称,具体如下,就可以是现在负载均衡。每次请求,都会平均的落到每个服务器上。
具体详细的可以参考以下别人总结的文章:
Nginx深入详解之upstream分配方式 具体我配合docker来做一个案例,用docker来搭建两个nginx服务器及一个tomcat服务器,分别映射不同的端口号,让其中一个nginx服务器来做负载均衡。
# 下载并运行一个nginx服务器,映射端口号8011到80端口
$ docker run -d -p 8011:80 --name some-nginx daocloud.io/library/nginx:latest
# 在运行一个nginx容器,映射端口号8012到80端口,4bb46517cac3 为刚才运行的nginx的容器的镜像id
$ docker run -d -p 8012:80 --name some-nginx1 4bb46517cac3
# 下载并运行一个tomcat服务器,映射端口号8082到8080端口, todo 注意tomcat的默认路径下的默认文件存在请求js和css,会多次请求服务器,如果用默认的负载均衡方式会导致负载均衡出问题,最好在tomcat下增加一个index.html文件来做测试,这样每一次访问只会请求到一台服务器,可以很直观的看到效果
$ docker run -d -p 8082:8080 --name t8 daocloud.io/library/tomcat:8.5.15-jre8
# 本地把需要做负载均衡的config配置文件先做好
$ vi default.conf
# default.conf nginx配置文件
upstream myServer{
server 10.0.2.15:8082; # IP 换成自己的
server 10.0.2.15:8012; # IP 换成自己的
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
# root /usr/share/nginx/html;
proxy_pass http://myServer;
index index.html index.htm;
}
}
# 把修改好的配置文件复制到docker的nginx容器(some-nginx)中
$ docker cp ./default.conf some-nginx:/etc/nginx/conf.d/default.conf
# 重启一下
$ docker restart some-nginx
此时服务器的配置已经做好,在浏览器中访问做负载均衡的服务器就可以验收结果了。
负载均衡策略
Nginx为我们默认提供了三种负载均衡的策略:
1.轮询: 将客户端发起的请求,平均分配给每一台服务器
2.权重: 会将客户端的请求,根据服务器的权重值不同,分配不同的数量
3.ip_hash: 基于发起请求的客户端的ip地址不同,他始终会将请求发送到指定的服务器上 就是说如果这个客户端的请求的ip地址不变,那么处理请求的服务器将一直是同一个
轮询
轮询的案例就是上边的那个案例,很简单,下边是简单的配置说明
# 需要轮询的Ip及端口号
upstream my_server{
server ip:port;
server ip:port;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://upstream名称/;
}
}
权重
权重的实现方法,在upstream中对每一项服务器的后边增加weight。具体如下,配置下边这个后,我重启用docker搭建的负载均衡的nginx服务器,然后发起请求,会发现五次请求tomcat服务器后会有一次nginx服务器请求。
upstream myServer{
server 10.0.2.15:8082 weight=10; # IP 换成自己的
server 10.0.2.15:8012 weight=2; # IP 换成自己的
#server 10.0.2.15:8011;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://myServer;
#root /usr/share/nginx/html;
index index.html index.htm;
}
}
ip_hash
ip_hash的实现,在upstream的第一行添加ip_hash后,会对ip进行锁定,每一个ip只会请求一个服务器,这个时候我在重启服务器,进行请求后,就会发现只能访问到nginx服务器。
upstream myServer{
ip_hash;
server 10.0.2.15:8082 weight=10; # IP 换成自己的
server 10.0.2.15:8012 weight=2; # IP 换成自己的
#server 10.0.2.15:8011;
}
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://myServer;
#root /usr/share/nginx/html;
index index.html index.htm;
}
}
动静分离
Nginx的并发能力公式:
worker_processes * worker_connections / 4|2 = Nginx最终的并发能力
动态资源需要/4,静态资源需要/2
Nginx通过动静分离来提升Nginx的并发能力,更快的给用户响应
动态资源代理
没什么好说的,基本上之前都是动态的
#配置如下
location / {
proxy_pass 路径;
}
静态资源代理
# nginx 配置项
server {
listen 80;
listen [::]:80;
server_name localhost;
# 在 /web/data 下创建html文件夹,然后把一个index.html文件放到里边
location /html {
root /web/data;
index index.html;
}
# 在 /web/data 下创建img文件夹,然后把一个123.html文件放到里边
location /img {
root /web/data;
autoindex on; #代表展示静态资源的全部内容,以列表的形式展开
}
}
<!- index.html文件内容, 直接把图片也直接放到了内容中一起请求,看是否可以直接成功 ->
<h1>test img</h1>
<img src="http://192.168.1.113:8013/img/123.jpg"/>
全都成功了,html静态页面也正常访问到,图片也可以正常访问到
我们在来看一下 “autoindex on ”的作用,如下