常用命令
记录下,在windows下nginx常用命令:
进入nginx.exe的目录中:
nginx -v 查看当前nginx版本号;
nginx -V 查看当前nginx版本号及配置参数;
start nginx 启动nginx,在windows下回有一个闪烁;
nginx -s stop 强制关闭当前nginx服务;
nginx -s reload 重新加载当前nginx服务;
taskkill /F /IM nginx.exe > null 此命令可强制关闭所有的nginx服务(有可能存在多开的nginx情况,如果有多开情况,会影响到负载均衡,有时候代码配置的都对,但是负载均衡没效果,很有可能是开了好几个nginx!!!);
nginx -t 查看nginx的配置情况;
配置静态资源服务器
一、静态文件访问:
在安装nginx文件夹下,创建一个文件夹,下边我们创建的是static文件夹,里边放一个vue打包好的项目来测试,nginx默认会自动加载以index命名的文件。
下边配置中,当我们访问 http://localhost:8989 时,nginx会执行 location 里边的配置,加载static文件夹里边的index文件,autoindex on; 配置是开启目录访问权限,可以打开目录游览,autoindex 默认情况下是off 关闭的:
worker_processes 1;
events {
worker_connections 1024;
}
http {
server {
listen 8989;
server_name localhost;
location / {
alias static/;
autoindex on;
}
}
}
访问localhost:8989,显示如下:
访问lcoalhost:8989/static目录,显示如下:
二、文件压缩
上边vue项目,打包之后是1M多,在页面初次加载时,如果服务器带宽不够,页面要加载好长时间,用户体验很差,nginx给我们提供了文件压缩功能,如下:
http {
# 下边这两个必须配置,否则样式加载不出来!不设置css文件就会被当作text/plain类型发送到浏览器,从而导致css样式无法显示。
include mime.types;
default_type application/octet-stream;
gzip on; # 开启文件压缩
gzip_min_length 1; # 如果文件小于1字节,就不在压缩了
gzip_comp_level 2; # 压缩级别
# 支持的压缩类型
gzip_types text/plain application/x-javascript text/css application/xml application/javascript text/javascript application/x-httpd-php image/jpeg image/gif image/png;
}
未开启文件压缩之前:
加上gzip之后的文件大小及加载速度提升了不少:
chrome浏览器上:
火狐浏览器上:
三、访问限速
当文件过大的时候,我们需要限制访问速度,以备足够的带宽来加载js/css。如果想这么做,只需要加下边的指令:
set $limit_rate 1k;
http {
include mime.types;
default_type application/octet-stream;
server {
listen 8989;
server_name localhost;
location / {
alias static/;
autoindex on;
set $limit_rate 1k; # 每秒传输1k
}
}
}
加上限速,在看下效果,访问贼慢:
四、日志记录
平时开发中,经常通过日志来排查问题,当然,Nginx也提供了日志记录。首先在配置文件中的server指令块中设置指令。
默认使用 "main" 的日志格式,当然你也可以自定义格式。
参数明细表:
$remote_addr | 客户端的ip地址(代理服务器,显示代理服务ip) |
$remote_user | 用于记录远程客户端的用户名称(一般为"-") |
$time_local | 用于记录访问时间和时区 |
$request | 用于记录请求的url以及请求方法 |
$status | 响应状态码,例如: 200成功、404页面找不到等。 |
$body_bytes_sent | 给 客户端发送的文件主体内容字节数 |
$http_user_agent | 用户所使用的的代理(一般为浏览器) |
$http_x_forwarded_for | 可以记录客户端IP,通过代理服务器来记录客户端的ip地址 |
$http_referer | 可以记录用户是从哪个链接访问过来的 |
http {
# 配置日志格式及输出的信息
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_refer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
# 日志输出地方
access_log logs/qf.host.access.log main;
location / {
set $limit_rate 10k;
}
}
}
配置好之后,客户端访问时,会生成一个日志文件,以及输出响应的信息:
负载均衡配置
worker_processes 1;
events {
worker_connections 1024;
}
http {
# 负载均衡配置
upstream test {
server 192.168.1.85:3000 weight=1; # 权重配置
server 192.168.1.85:4000 weight=2;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://test; # test必须跟上边upstream后的test一致
}
}
}
这里我使用koa创建好了服务,在本地分别启动3000端口和4000端口:
本地起了2个服务,当我们访问三次localhost时,可以看到权重高的 端口为4000的被访问了2次,而3000端口被访问了一次,证明已配置成功。
负载均衡的策略:
nginx的负载均衡策略有4种:
(1)轮询(默认)
最基本的配置方法,它是upstream的默认策略,每个请求会按时间顺序逐一分配到不同的后端服务器。
(2)权重
weight默认为1,weight值越高,被访问的次数越高。
注意:
适用环境:此策略适合服务器的硬件配置车别比较大的情况
upstream test {
server localhost:3000 weight=1;
server localhost:4000 weight=2; # 用户访问三次,有2次会打到4000端口
}
(3)ip_hash
负载均衡起按照IP地址的分配方式,可以确保相同客户端的请求一直会发送到相同的服务器,这样每个访客都固定访问一个后端服务器(也就是同一个ip客户端不会一会儿访问端口为3000的服务,一会儿又访问端口为4000的服务)。
注意:
- 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
- ip_hash不能与backup同时使用。
- 此策略适合有状态服务,比如session。
- 当有服务器需要剔除,必须手动down掉。
upstream test {
ip_hash;
server 192.168.1.85:3000 weight=1;
server 192.168.1.85:4000 weight=2;
}
(4)least_conn 最小链接
把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn 这种方式就可以达到更好的负载均衡效果。
upstream test {
least_conn;
server 192.168.1.85:3000 weight=1;
server 192.168.1.85:4000 weight=2;
}
注意:
- 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。除了上面这些调度策略之后,还有一些第三方的调度策略可以集成到nginx中。在实际运用中,需要根据不同的场景选择不同的策略,大多是多种策略结合使用以达到实际需求的性能。
补充(2022-03-04):
如果别的服务直接访问接口,或第三方服务往接口推数据,这种方式做后端接口的负载均衡,如下:
upstream chr {
server localhost:8080;
server localhost:8085;
}
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root D:\dist;
try_files $uri $uri/ /index.html;
index index.html index.htm;
}
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/;
}
}
server {
listen 8088;
server_name localhost;
charset utf-8;
# 负载均衡,
# 注意:/mychr 这个路径是后端真实的接口路径,而不是代理的路径!!!
# 访问:http://localhost:8088/mychr 时,会把域名和端口号做负载均衡的代理
# 真实请求是:http://localhost:8080/mychr 或 http://localhost:8085/mychr
location /mychr {
proxy_set_header Host $host;
proxy_pass http://chr;
}
}
反向代理:
有这么一个需求,我在浏览器输入www.123.com 之后, 需要访问本地开启的一个服务,地址为:192.168.141.2:3000,最后效果如下:
我们可以用nginx作反向代理,流程应该为:浏览器输入www.123.com 之后, 首先会查看本机hosts文件中是否有对应ip和域名映射,我们提前配置好hosts文件之后,浏览器会拿到 192.168.32.64 这个IP地址(也就是我本机的一个ip地址)去访问,此时这个访问 会被nginx拦截,nginx已经配置好了,当我们访问192.168.32.64 时,它会执行localtion中proxy_pass的代理地址 -> 也就是192.168.141.2:3000这个地址,所以最终会在页面上看到正确结果。
第一步:配置本机hosts文件(当我们在浏览器输入一个网址时,首先会查看本机hosts文件中是否有对应ip和域名映射,有的话会直接拿到这个ip去查找内容):
前边的192.168.32.64 是我本机的一个ip地址
第二步:配置完hosts文件之后,在nginx中,做反向代理:
worker_processes 4;
events {
worker_connections 1024;
}
http {
upstream local {
server 192.168.141.2:3000;
}
# 反向代理
server {
listen 80;
server_name 192.168.32.64;
location / {
proxy_pass http://local;
}
}
}
配置完,即可访问成功。