windows下Nginx配置及负载均衡使用
Posted 嘉禾嘉宁papa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows下Nginx配置及负载均衡使用相关的知识,希望对你有一定的参考价值。
目录
一、简介
nginx(engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上Nginx的并发能力在同类型的网页服务器中表现较好,许多的大厂都在用。
今天我们就来讲一下windows下Nginx的安装配置及简单负载均衡的使用。
二、环境准备
2.1、下载
Nginx下载地址: http://nginx.org/en/download.html,本文中下载第二个windows的稳定版本。如图:
2.2、Nginx目录
这里我解压到本地C:\\myProgram\\Nginx-1.20.1\\后的目录结构如下:
进入到配置文件目录C:\\myProgram\\Nginx-1.20.1\\conf,我们新建一个conf.d的目录,用于存放自定义的配置文件等。
2.3、常用命令
这里我们列出一些常用的命令,后续可以直接使用:
命令 | 含义 |
---|---|
nginx -h | 查看帮助信息 |
nginx -v 或者 nginx -V | 查看Nginx的版本号,v只是简单显示版本信息,V不但显示版本信息,还显示配置参数信息 |
nginx -s reopen | 打开日志文件 |
nginx -t | 验证(nginx.conf)配置文件是否有语法错误 |
nginx -s reload | 配置文件修改重装载命令 |
nginx -c 指定配置文件的路径 | 指定配置文件启动,默认是conf/nginx.conf |
start nginx | 启动Nginx |
nginx -s quit | 正常停止或关闭Nginx |
nginx -s stop | 快速停止或关闭Nginx |
注意:
window版本启动方式建议是进入到安装的目录,比如我这里的C:\\myProgram\\Nginx-1.20.1\\conf,通过cmd命令,先执行nginx -t检查配置文件是否配置正确,再执行start nginx,如图:
如果是已经启动了,修改了配置文件则只需要执行nginx -t,再执行nginx -s reload即可。启动成功后,访问下:http://localhost:80或者http://localhost,出现如下图及表示成功了:
三、配置
之前我们看过目录结构,一般nginx.conf类上于全局的配置,我们可以在自定义的目录conf.d创建我们的配置文件,一般按照域名加端口的方式命名,如localhost_80、localhost_443等,负载均衡的都放到conf.d目录,命名为upstream.conf,当然你也可以不同方式命名。对于nginx配置最好分类,如果配置多了就很难维护了。
3.1、配置nginx.conf
#Nginx的全局配置,也就是main,包含Events和HTTP
#指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行(windows会有警告信息)
#user nobody nobody;
#指定了Nginx要开启的进程数,每个Nginx进程平均耗费10M~12M内存
worker_processes 2;
#定义全局错误日志文件,一定要设置warn级别以上,日志输出级别有:[debug|info|notice|warn|error|crit]
error_log logs/error.log notice;
#指定进程pid的存储文件位置
pid logs/nginx.pid;
#Nginxworker最大打开文件数
worker_rlimit_nofile 65535;
#events事件指令是设定Nginx的工作模式及连接数上限
events{
#指定Nginx的工作模式,Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll
#use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65536;
}
#设定http服务器
http{
#实现对配置文件所包含的文件的设定
include mime.types;
#默认文件类型:二进制流
default_type application/octet-stream;
#服务域名的最大hash表大小
server_names_hash_max_size 512;
#服务域名的hash表大小
server_names_hash_bucket_size 128;
#指定Nginx日志的输出格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent $request_body "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'"responsetime":$request_time'
'-"$upstream_cache_status"'
' Alian $http_[W-Os] $http_[W-Brand] $http_[W-Model] $http_[W-IMEI] $http_[W-App-Version] $http_[W-Token] $http_[W-Partner-Id] $http_[W-Operator-Id] $http_[W-Window-Id]';
log_format logstash '{"@timestamp":"$time_iso8601",'
'"slbip":"$remote_addr",'
'"clientip":"$http_x_forwarded_for",'
'"serverip":"$server_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"domain":"$host",'
'"method":"$request_method",'
'"requesturi":"$request_uri",'
'"url":"$uri",'
'"appversion":"$HTTP_APP_VERSION",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
'"status":"$status",'
'"W-Brand":"$http_[W-Brand]",'
'"W-Model":"$http_[w-model]",'
'"W-Token":"$http_[w-token]",'
'"W-Token":"$http_[W-Token]",'
'"devicecode":"$HTTP_HA"}';
#允许客户端请求的最大的单个文件字节数
client_max_body_size 20m;
#指定来自客户端请求头的headerbuffer大小
client_header_buffer_size 32K;
#指定客户端请求中较大的消息头的缓存最大数量和大小
large_client_header_buffers 4 32k;
#用于开启高效文件传输模式
sendfile on;
#数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,从而提高I/O性能,也可以有助于解决网络堵塞,当然会有一点点延迟(使用sendfile函数时,tcp_nopush才起作用,和tcp_nodelay互斥)
tcp_nopush on;
#发送小块数据时,立即发送数据,响应快,客户端受益(和tcp_nopush互斥)
tcp_nodelay off;
#设置客户端连接保持活动的超时时间,单位是秒,超过则关闭连接
keepalive_timeout 60;
#自动创建索引,比如目录浏览下载功能,默认关闭
autoindex off;
#设置客户端请求头读取超时时间
client_header_timeout 10;
#设置客户端请求主体读取超时时间,默认值是60
client_body_timeout 30;
#指定响应客户端的超时时间
send_timeout 30;
#设定Nginx服务器和后端FastCGI服务器连接的超时时间
fastcgi_connect_timeout 60;
#设定Nginx允许FastCGI服务端返回数据的超时时间
fastcgi_send_timeout 60;
#设定Nginx从FastCGI服务端读取响应信息的超时时间
fastcgi_read_timeout 60;
#设定用来读取从FastCGI服务端收到的第一部分响应信息的缓冲区大小
fastcgi_buffer_size 64k;
#设定用来读取从FastCGI服务端收到的响应信息的缓冲区大小以及缓冲区数量
fastcgi_buffers 4 64k;
#设定系统很忙时可以使用的fastcgi_buffers大小,推荐大小为fastcgi_buffers *2
fastcgi_busy_buffers_size 128k;
#fastcti临时文件的大小,可设置128-256K
fastcgi_temp_file_write_size 128k;
#配置Nginx的HttpGzip模块(是否安装了HttpGzip模块,优化网站)
#开启GZIP压缩,实时压缩输出数据流
#gzip on;
#设置允许压缩的页面最小字节数,默认0,不管页面多大都进行压缩,建议大于1K
#gzip_min_length 1k;
#申请4个单位为16K的内存作为压缩结果流缓存
#gzip_buffers 4 16k;
#设置识别HTTP协议版本,默认是1.1
#gzip_http_version 1.1;
#指定GZIP压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源
#gzip_comp_level 3;
#指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的
#gzip_types text/plain application/x-javascript text/css application/xml;
#让前端的缓存服务器缓存经过GZIP压缩的页面
#gzip_vary on;
#包含子配置文件,此处是包含conf.d目录下所有的.conf文件
include conf.d/*.conf;
include fastcgi.conf;
}
3.2、自定义配置localhost_80.conf
server{
listen 80 ;
#server_name 10.130.3.16;
server_name localhost;
charset utf-8;
add_header X-Cache $upstream_cache_status;
#站点根目录(自定义的,不一定是这个)
root html;
location / {
root html;
index index.html index.htm;
}
location ~ ^/NLB/ {
proxy_redirect off;
#端口
proxy_set_header Host $host;
#远程地址
proxy_set_header X-Real-IP $remote_addr;
#程序可获取远程ip地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#此处会用的upstream.conf,此文件在nginx.conf已经引入了
proxy_pass http://load-balance;
}
#所有静态文件由nginx直接读取不经过tomcat或resin($和{中间有一个空格)
location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
expires 30d;
}
#($和{中间有一个空格)
location ~ .*.(js|css)?$ {
expires 15d;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ ^.*\\.svn\\/{
deny all;
}
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status off;
access_log logs/NginxStatus.log;
auth_basic "NginxStatus";
auth_basic_user_file confpasswd;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}
#可以绝对路径,如果是相对路径就是相对执行启动的目录(nginx.exe)
access_log logs/localhost_access.log;
}
3.3、自定义负载均衡配置upstream.conf
upstream load-balance {
#预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器
server 127.0.0.1:8082 backup;
#当前的server暂时不参与负载均衡
server 127.0.0.1:8083 down;
server 127.0.0.1:8084;
server 127.0.0.1:8085;
}
事实上我们还可以配置权重信息weight,值越大轮询到的可能性就更大,max_fails允许请求失败的次数,默认为1,fail_timeout在经历了max_fails次失败后,暂停服务的时间,两者一般一起使用,如下:
upstream load-balance {
#预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器
server 127.0.0.1:8082 backup;
#当前的server暂时不参与负载均衡
server 127.0.0.1:8083 down;
server 127.0.0.1:8084 weight=10;
server 127.0.0.1:8085 weight=1 max_fails=2 fail_timeout=30s;
}
四、测试及运行结果
4.1 测试项目
application.yml
server:
port: 8082
servlet:
context-path: /NLB
package com.alian.loadbalance.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
public class LoadBalanceController {
@Value("${server.port}")
private int serverPort;
@RequestMapping("loadBalance")
public String loadBalance(){
log.info("服务【{}】的处理返回",serverPort);
return "服务端口:"+serverPort;
}
}
4.2 在idea运行多实例服务
如果要使应用高可用,就需要服务部署多个,这里以idea为例,看本机怎么测试。因为配置文件里我们端口是8082,我们的应用只要端口不一样即可,所以我们每次启动的时候就更改端口,我这里启动的4个,具体说明如下:
服务NLB端口 | 说明 |
---|---|
8082 | 热备份 |
8083 | 下线状态 |
8084 | 正常运行 |
8085 | 正常运行 |
通过idea运行旁边的Edit configurations右上角勾上Allow parallel run,记得每次都要更改端口,再运行哦,具体启动如下图:
4.3 正常请求
连续请求两次:http://localhost/NLB/loadBalance得到结果:
不管两次还是多次,结果都是轮询返回的,这是基于nginx默认的轮询规则。
4.4 其他测试
关闭端为8084和8085的实例。再次请求http://localhost/NLB/loadBalance,发现我们的热备服务器起作用了,得到结果为:
4.5 静态资源请求
我们在C:\\myProgram\\Nginx-1.20.1\\html下放一个图片AlianBlog.png,因为localhost_80.conf已经配置了根目录就是html,所有我们直接请求http://localhost/AlianBlog.png,结果如下:
以上是关于windows下Nginx配置及负载均衡使用的主要内容,如果未能解决你的问题,请参考以下文章