Nginx基本概念
反向代理
正向代理
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问反向代理
将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址
负载均衡
单个服务器解决不了,增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器上
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力
安装
下载
- 本地下载,下载地址 https://nginx.org/en/download.html 下载后上传至CentOS下的/usr/local/目录下
wget直接下载
cd /usr/local wget http://nginx.org/download/nginx-1.17.1.tar.gz
安装
- 解压安装包
tar -zxvf nginx-1.17.1.tar.gz
注意:nginx被解压到了/usr/local/nginx-1.17.1目录下(不要把压缩包解压到/usr/local/nginx目录下,或者将解压后的目录重命名为nginx,因为nginx会默认安装到/usr/local/nginx目录下) 安装前准备
安装前先安装nginx所需的依赖库,如果缺少依赖库,可能会安装失败yum install gcc-c++ yum install pcre yum install pcre-devel yum install zlib yum install zlib-devel yum install openssl yum install openssl-devel
进入nginx-1.17.1目录下,并执行以下配置命令
cd nginx-1.17.1 ./configure
configure操作会检测当前系统环境,以确保能成功安装nginx
如果没有错误,则可进行下一步- 执行make安装
make install
配置nginx开机启动
切换到/lib/systemd/system/目录,创建nginx.service文件,添加以下内容[unit] Description=nginx After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx reload ExecStop=/usr/local/nginx/sbin/nginx quit PrivateTmp=true [Install] WantedBy=multi=-user.target
退出保存文件,执行如下命令使nginx开机启动
systemctl enable nginx.service
验证是否安装成功
# 将80端口添加到防火墙中 firewall-cmd --zone=public --add-port=80/tcp --permanent # 重新加载 firewall-cmd --reload
访问主机地址即可
常用命令
进入目录 /usr/local/nginx/sbin,在此目录下操作
- 查看版本号
./nginx -v
- 启动
./nginx
- 关闭
./nginx -s strop
- 重新加载
./nginx -s reload
Nginx配置文件
位置 /usr/local/nginx/conf/nginx.conf
组成:三部分
全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,比如worker_processes 1;
worker_processes值越大,可以支持的并发处理量也越多events块
events块涉及的指令主要影响Nginx服务器与用户的网络连接,比如worker_connections 1024;
支持的最大连接数- http块
Nginx服务器配置最频繁的部分- http全局块
包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限 - server块
与虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术是为了节省互联网服务器硬件成本
每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机
而每个server块也分为全局server块,以及可以同时包括多个location块- 全局server块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置 - location块
一个server块可以配置多个location块。
这块的主要作用是基于Nginx服务器接收到的请求字符串,对虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能等,还有许多第三方模块也在这里进行
- 全局server块
- http全局块
简单实例
反向代理
反向代理实例一
启动一个tomcat,当访问127.0.0.1:8080时出现欢迎界面,实现访问127.0.0.1(不加端口号时默认为80端口)时跳转到127.0.0.1:8080路径上。配置如下
server { listen 80; server_name 127.0.0.1;//配置监听的地址 location / { root html; proxy_pass http://127.0.0.1:8080; //配置转发的地址 index index.html index.htm index.jsp } }
反向代理实例二
实现根据访问的路径跳转到不同端口的服务中,nginx监听端口为9001,访问http://127.0.0.1:9001/edu/ 直接跳转到127.0.0.1:8080,访问http://127.0.0.1:9001/vod/ 直接跳转到127.0.0.1:8081 。准备两个tomcat服务器,一个8080端口,一个8081端口,开放对外访问的端口号 9001 8080 8081。配置如下server { listen 9001; server_name 127.0.0.1; location ~/edu/ { proxy_pass http://127.0.0.1:8080; } location ~/vod/ { proxy_pass http://127.0.0.1:8081; } }
location指令说明
该指令用于匹配URL
语法如下:location [ = | ~ | ~* | ^~ ] uri { }
- =:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求
- ~:用于表示uri包含正则表达式,并且区分大小写
- ~*:用于表示uri包含正则表达式,并且不区分大小写
- ^~:用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配
负载均衡实例
将请求分别分配到8080端口和8081端口中,配置如下
http { ...... upstream myserver { ip_hash;//分配服务器策略,不写默认轮询 server 127.0.0.1:8080; server 127.0.0.1:8081; } ...... server { ...... location / { proxy_pass http://myserver; proxy_connect_timout 10; ...... } } }
- nginx分配服务器策略
- 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,能自动剔除 - weight
代表权重,默认为1,权重却高被分配的客户端越多 - ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器 - fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
- 轮询(默认)
动静分离
将动态和静态请求分开,比如Nginx处理静态页面,Tomcat处理动态页面。动静分离从实现角度分两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另一种方法是动态和静态文件混合在一起发布,通过nginx来分开。
通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200
具体配置
server { listen 80; ...... location /www/ { root /data/; index index.html index.htm; } location /image/ { root /data/; autoindex on; } }
Nginx原理
master&worker
- master-workers机制的好处
首先,对于每个每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其他进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worder上的所有请求失败,不过不会影响到所有的请求,所以降低了风险。 - 需要设置多少个worker
Nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求,即使是成千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗 设置worker数量
worker_processes 4 # work绑定cpu(4work绑定4cpu) worker_cpu_affinity 0001 0010 0100 1000 # work绑定cpu(4work绑定8cpu中的4个) worker_cpu_affinity 00000001 00000010 00000100 00001000
连接数worker_connection
这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。当然,这里说的是最大连接数,对于http请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes,如果是支持http1.1的浏览器每次访问要占用两个连接,所以普通的静态访问最大并发数是:worker_connections * worker_processes / 2 ,而如果是http作为反向代理来说,最大并发数量应该是:worker_connections * worker_processes / 4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。nginx.conf结构
高可用的集群
Keepalived+Nginx高可用集群(主从模式)
集群架构图
具体略···