nginx基本概念
1 nginx 是什么?能做什么?
nginx是一个高性能的HTTP和反向代理的Web服务器,同时也提供了IMAP/POP3/SMTP服务
轻量级,占有内存少,并发性强,有报告表明Nginx能支持50000个并发连接数
功能:1 反向代理 2 负载均衡 3 动静分离 4 高可用
2 反向代理
正向代理:在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
反向代理:将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端。此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实服务器的地址。
3 负载均衡
单个服务器解决不了,我们增加服务器数量,然后将请求分发到各个服务器上。将原先请求到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器也就是我们所说的负载均衡。
4 动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析。加快解析速度,降低原来单个服务器的压力。
nginx安装和命令和配置文件
nginx操作的常用命令:
使用nginx操作命令前提条件: 必须进入nginx的目录: XX.../nginx/sbin 里面有个nginx文件
查看nginx版本号: ./nginx -v
启动nginx: ./nginx
关闭nginx: ./nginx -s stop
重加载nginx: ./nginx -s reload
nginx 配置文件:
位置: XX.../nginx/conf/nginx.conf
三部分组成:
全局块:从配置文件开始到events块之间。设置整体运行的指令
worker_processes 1; // 这是nginx并发处理服务的关键配置,worker_processes值越大,并发处理量也越大,但是会收到硬件软件的制约
影响nginx和用户网络的连接
events块:events {
worker_connections 1024; //最大连接数
}
http块,配置最频繁:
http {...}
http块包括了http和server两部分
http全局块配置的指令包括文件引入、MIME-TYPE定义,日志自定义,连接超时时间,单链接请求数上限等
server块和虚拟主机有密切关系
每个http块可以包含多个server块,而每个server块相当于一个虚拟主机
而每个server块也分为全局server块,以及可以同时包含多个location块
全局server块:
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置
location块:
一个server块可以配置多个location块
主要作用于nginx服务器接收到的请求字符串,对虚拟主机名称之外的的字符串进行匹配,对特别的请求进行处理。地址定向,数据缓存和应答控制等功能,还有许多第三方模块的配置也可以在这里进行
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
proxy_set_header X-Real-IP $remote_addr;
server {
listen 80; #监听80端口
server_name localhost; #主机名称localhost
client_max_body_size 100m;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /api/xtgl/ { # 接收到192.168.0.71:80/api/xtgl/请求
proxy_pass http://192.168.0.71:7080/; # 转发
}
location /api/login/ {
proxy_pass http://192.168.0.71:7081/;
}
location /api/v1/ {
proxy_pass http://192.168.0.71:7080/;
}
location /api/v2/ {
proxy_pass http://192.168.0.71:7081/;
}
location /api/v3/ {
proxy_pass http://192.168.0.71:7090/;
}
}
}
location [ = | ~ | ~* | ^~ ] uri{}
= : 用于不含正则表达式的uri前,要求请求字符串与uri严格匹配。如果匹配成功就停止继续向下搜索并立刻处理该请求
~ : 用于表示uri保包含正则表达式,并且区分大小写
~* :用于表示uri保包含正则表达式,并且不区分大小写
^~ : 用于不含正则表达式的uri前,要求Nginx服务器找到标志uri和请求字符串匹配度最高的location后,立刻使用此location处理请求,而不再使用location块中正则的uri和请求字符串做匹配
nginx配置实例
反向代理实例
案例一:
location / {
root html;
proxy_pass http://192.168.0.71:7081/;
index index.html index.htm;
}
案例二:
server {
listen 8009;
server_name somename alias another.alias;
location ~/edu/ { #正则表达式的形式,里面有deu转发到。。。
proxy_pass http://192.168.0.71:7081/;
}
location ~/vod/ { #正则表达式的形式,里面有vod转发到。。。
proxy_pass http://192.168.0.71:7083/;
}
}
负载均衡实例
http{
...
upstream myserver{
# 待负载均衡的两台服务器
# ip_hash;
server 192.168.0.71:8080 weight=2;
server 192.168.0.71:8081;
# fair;
}
server{
location /v1/{
proxy_pass http://myserver;
# proxy_connect_timeout 10;
}
}
...
}
分配策略:
1 轮询(默认)
2 weight 代表权重,默认为1,权重越高被分配的用户端越多
3 ip_hash :每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
4 fair : 按后端服务器的响应时间来分配请求,响应时间短的优先分配
动静分离实例
简单来说就是把动态和静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。
实现的角度分为两种:
1 静态文件单独成独立的域名,放在独立服务器上,目前主流推崇方案
2 动态静态文件混合在一起发布,通过nginx分离
通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器的请求和流量。
# /data/www/ 路径
location /www/ {
root /data/;
autoindex on; # 能列出文件目录
}
nginx配置高可用的集群
主备服务器,预防一台nginx宕机。需要用到keepalived
准备工作:
1 需要两台安装了 nginx 和 keepalived 的服务器
keepalived安装后会在etc里生成一个目录,就是keepalived,里面有一个 keepalived.conf 文件
完成keepalived中的主备配置:
以上ens160,docker0等都为网卡
keepalived:
一个功能比较完整的keepalived 的配置文件,其配置文件keepalived.conf 可以包含三个文本块:全局定义块、VRRP 实例定义块及虚拟服务器定义块。全局定义块和虚拟服务器定义块是必须的,如果在只有一个负载均衡器的场合,就不须VRRP 实例定义块
https://www.cnblogs.com/coprince/p/6738710.html
#全局定义
global defs{
notification_email{
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL #唯一标志,可以是ip,通过域名访问服务器需要在/etc/hosts中配置
}
# vrr_script 实例定义块
vrr_script chk_http_port{
script "/user/local/src/nginx_check.sh"
interval 2 #检测脚本执行间隔,判断nginx是否失效
weight 2 # 设置当前服务器的权重
}
vrr_instance VI_1{
state BACKUP #备份服务器上 将MASTER 改为 BACKUP
interface ens33 #网卡
virtual_router_id 51 #主备机的virtual_router_id必须相同
priority 100 # 主备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 每隔1秒发送一次心跳,检测主机是否活着
authentication{
auth_type PASS
auth_pass 1111
}
virtual_ipaddress{
192.168.18.28 # VRRP H虚拟地址,可以绑定多个
}
}
niginx_check.sh检测脚本如下
启动keepalived
启动
systemctl start keepalived.service
停止
systemctl stop keepalived.service
nginx执行原理
1 一个master 和多个worker的好处
a 可以使用 nginx -s reload,这是一种热加载(热部署)方式,不需要停止启动,就可以让nginx的配置生效,利于nginx进行热部署操作
b 每个work独立进程,不需要加锁。如果其中一个wordk挂了,其他work还可以进行工作,不会造成服务中断
c 设置多少work合适?每隔work进程可以把一个cpu数发挥到极致,因此work数和服务器的cpu数目相等最适宜
连接数:work_connection
问:发送一个请求占用worker的几个连接数?
答:要么2个,要么4个。访问静态资源,来一个连接,去一个连接,所以占用2个;访问动态资源,还要来去访问tomcat,因此4个。
问:nginx中有一个master,4个worker,每个worker支持最大的连接数是1024,目前worker支持的最大并发数是多少?
答:4 * 1024 /2或者4