目录
Nginx介绍
什么是Nginx
Nginx是一个轻量级的高性能web服务器。
特点:占用内存小,并发强,启动快速,支持7x24小时不间断运行
Nginx常用功能
负载均衡,反向代理,动静分离
启动nginx后,会启动两个进程
master进程,读取配置文件,管理worker进程
worker进程,维护线程,处理请求
windows/linux安装方式=》百度
配置文件nginx.conf
配置文件分三大模块:全局变量配置模块,events性能配置模块,http请求处理模块
配置文件内容模板
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
......
}
......
}
全局变量模块
user nobody; 指定用户组
worker_processes 1; 工作进程数,默认1,可调至CPU最大核数,一个进程绑定一个CPU核
events性能配置模块
与用户网络连接有关,性能的优化一般调整此模块的参数,如配置允许同时接受的网络连接数,每个进程的最大连接数,选取某种事件驱动模型处理请求,开启多个网络连接序列化等,如:
worker_connections 1024; 配置单个工作进程允许创建的外部连接数
http请求处理模块
http模块的全局配置块
单连接请求数设置,日志设置,连接超时时间设置,开启文件传输等
include mime.types;
default_type application/octet-stream;sendfile on;
keepalive_timeout 65;
server块
(1) 一个http模块中可配置多个server块,每个server代表一个虚拟主机(服务)
(2) listen 80; 监听80端口
(3) server_name localhost; 服务域名
(4) location 用于配置不同的接口转发
location / {
root html;
index index.html index.htm;
}root表示静态资源 由nginx返回资源 html为静态资源的目录
index表示对应静态资源目录下某个静态资源
表示80端口下 所有"/"请求均会被转发至静态资源
location /admin {
proxy_pass http://127.0.0.1:8082;
}表示监听了80端口下的/admin接口,转发至http://127.0.0.1:8082
proxy_pass表示动态请求,将此请求转发至对应的服务上,可配置多个proxy_pass
常用命令
whereis nginx 查看安装目录
cd /usr/local/nginx/sbin 切换至安装目录、
./nginx 启动nginx
ps -ef | grep nginx 查看nginx是否启动成功
ps aux | grep nginx 查看nginx进程
nginx -s stop 强制停止nginx
nginx -s quit 安全退出nginx,等所有进程都完成后关闭退出
vim nginx.conf 修改配置文件(编辑后 esc退出编辑模式,:wq 保存退出)
nginx -t 检测配置文件是否存在问题
nginx -s reload 重启nginx
反向代理
正向代理
代理客户端,如VPN代理,如访问YOUTUBE
反向代理
代理服务端,如多个客户端多个请求过来,通过nginx代理后转发至不同服务器
反向代理单个服务
在location中新增proxy_pass
当proxy_pass 不携带接口信息
location /admin {
proxy_pass http://127.0.0.1:8082;
}实际转发 为请求 http://127.0.0.1:8082/admin
当proxy_pass 携带接口信息
location /web/admin {
proxy_pass http://127.0.0.1:8082/admin;
}实际转发 为请求 http://127.0.0.1:8082/admin
反向代理多个服务
(1)在location中新增多个proxy_pass
location /admin {
proxy_pass http://127.0.0.1:8082;proxy_pass http://127.0.0.2:8082;
proxy_pass http://127.0.0.3:8082;
}
(2)添加upstream模块实现负载均衡
upstream test{
server 127.0.0.1:8082;server 127.0.0.2:8082;
server 127.0.0.3:8082;
}
server {listen 80;
server_name localhost;location /admin {
proxy_pass http://test;
}}
proxy_pass路径拼接规则
如果proxy_pass 后没有携带URL路径信息,如/或者/xxx,则反向代理会拼接location后的匹配部分,如果proxy_pass 后有配置具体的接口,则不再进行拼接
负载均衡
主要在upstream中进行负载均衡设置
为什么要使用负载均衡
如果是单体服务,当访问量过大会导致服务器有一定的压力,故准备多台服务器,将项目部署至多个服务器上,通过负载均衡,将请求按照设置的策略分配到不同的服务器上,以减轻服务器的压力
Nginx负载均衡的主要策略
轮询(默认方式)
根据请求的时间,按顺序分配至不同的服务器上,如果其中有某台服务器宕机,则会自动被排除
upstream test{
server 127.0.0.1:8082;server 127.0.0.2:8082;
server 127.0.0.3:8082;
}
设置weight权重
按照配置的权重比例分发请求,权重越大被分配到的请求几率越高
upstream test{
server 127.0.0.1:8082 weight = 3;server 127.0.0.2:8082 weight = 2;
server 127.0.0.3:8082 weight = 1;
}
设置ip_hash
根据ip的hash值进行分配,也就是ip相同就会分配到同一台服务器上,同时也有效解决了session共享问题
upstream test{
ip_hash;
server 127.0.0.1:8082;server 127.0.0.2:8082;
server 127.0.0.3:8082;
}
设置fair
需要下载安装nginx的upstream-fair模块,根据服务器响应速率来进行分配,谁响应快就会分到更多的请求
upstream test{
fair;
server 127.0.0.1:8082;server 127.0.0.2:8082;
server 127.0.0.3:8082;
}
nginx的其他使用
黑名单白名单配置
server块中
location / { #设置白名单 allow为允许访问得ip deny拒绝访问该路径得ip 默认都是allow all
allow xxx.xx.xxx.xx;
allow xxx.xx.xx.1/100;
deny all;
}
location /test { #只允许111.11.111.11访问/test目录
allow 111.11.111.11;
deny all;
}location / {
include whitelist.conff; #读取/etc/nginx下whitelist.conf 配置的白名单
deny all;
}cat /whitelist.conf
allow 10.1.1.10;
allow 10.1.1.11;
location匹配规则
location [=|~|~*|^~|!~|!~*] /uri/ { … }
= 精准匹配
^ 前缀匹配,
~ 区分大小写
~* 不区分大小写
不带任何修饰符,也表示前缀匹配
!~ 区分大小写 不匹配
!~* 不区分大小写不匹配
优先级:精准匹配=,前缀匹配^~,文件顺序正则,不带修饰符的前缀匹配。通用匹配/
当匹配成功后停止,按照当前匹配最详细的规则处理请求
匹配时遵循最佳匹配原则,按照匹配到最多的规则进行匹配,如
location ^~ /test/page 与 location ^~ /test
当请求为http:127.0.0.1:8081/test/page/xxx 则会优先匹配location ^~ /test/page并处理
动静分离
前端静态文件打包放在nginx同台服务器下,这样就不需要再到对应的远程服务器上获取资源,提高了前端页面响应速率,也可以在这一层实现简单的静态资源拦截
web缓存
对不同的文件进行缓存且配置灵活,支持FastCGI_Cache
Session共享问题
上文提到ip_hash实现负载均衡的策略,通过计算ip的哈希值,把相同ip分配到相同的服务器上,能够有效解决session共存问题,但是使用redis性能会更好
Keepalived保证Nginx的高可用
在多台服务器安装nginx,如果其中一个nginx服务宕机,则会立刻启用另一个nginx服务
keepalived更多功能后续学到补充
一些其他配置信息
(参考网上)
#全局变量配置模块
user test_admin; #设置用户/用户组 默认为nobody
worker_processes 1; #设置启动的进程数
error_log log/error.log debug; #设置日志路径及日志级别(debug/info/error等)
pid /nginx/pid/nginx.pid; #设置nginx进程运行文件存放的位置#events性能配置模块
events {
use epoll; #设置事件驱动模式,多路复用模式为epoll,但可以有效提高nginx的性能(select|poll|kqueue|epoll等)
worker_connections 1024; #单个工作进程worker process的最大请求数
accept_mutex on; #设置网路连接序列化,防止惊群现象,默认为on
multi_accept on; #设置单个进程是否同时接受多个网络连接,默认为off
}
http {
include mime.types; #文件拓展名与文件类型映射表
default_type application/octet-stream; #文件类型,默认为text/plain
access_log /nginx/access.log; #设定服务日志格式 access_log 关闭off
sendfile on; #sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件
#tcp_nopush on;
keepalive_timeout 65; #连接超时时间 默认为75s
gzip on; #开启gzip压缩
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
client_header_buffer_size 1k; #设定请求缓冲
large_client_header_buffers 4 4k;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
upstream test { #设定负载均衡的服务器列表
server 127.0.0.1:8080 weight=1; #weigth设置轮询权重
server 127.0.0.2:8080 weight=2;
server 127.0.0.3:8080 weight=3;
}
server {
listen 80; #监听80端口
server_name www.abc.com; #服务名 定义使用该域名访问
location / { #默认请求
root /root; #静态资源 根目录下的root目录
index index.php index.html index.htm; #静态资源 首页
}
error_page 500 502 /50x.html; #定义错误页面 内部跳转 访问出现500 502时返回对应50x.html内容 error_page 500 502 =200 /50x.html;自定义返回状态码变为200
location = /50x.html {
root /root;
}
location ~ ^/(images|javascript|js|css|flash|media|static)/ { #匹配静态文件
root /xxx/xxx;
expires 30d; #设置过期,有效期30天
}
location /NginxStatus { #设置查看Nginx状态地址
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}location / { #设置白名单 allow为允许访问得ip deny拒绝访问该路径得ip 默认都是allow all
allow xxx.xx.xxx.xx;
allow xxx.xx.xx.1/100;
deny all;
}
location /test { #只允许111.11.111.11访问/test目录
allow 111.11.111.11;
deny all;
}
}
}