-
基本概念
-
nginx是什么,做什么事情
- Nginx 是一个高性能的 HTTP 和反向代理 Web服务器,同时也是一个 IMAP/POP3/SMTP 代理服务器。Nginx 由俄罗斯的程序员伊戈尔·赛索耶夫开发,以其轻量级、内存占用少和并发能力强而闻名。在 Linux 系统下,Nginx 使用 epoll 事件模型,这使得它在 Linux 平台上的效率非常高
- Nginx作为web服务器
- Nginx 可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、PHP等。的那丝不支持java。Java程序只能通过tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。
-
反向代理
-
正向代理
- 如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
- 正向代理是一种位于客户端和原始服务器之间的服务器,其主要功能是帮助客户端访问通常无法直接访问的资源。在正向代理的架构中,客户端首先向代理服务器发送请求,并指定目标为原始服务器。然后,代理服务器向原始服务器转交请求,并获取响应。最后,代理服务器将获得的响应数据返回给客户端。(在客户端(浏览器)配置代理服务器,通过代理服务器进行访问)正向代理的典型用途包括:访问被限制的内容。例如,帮助用户在防火墙内访问互联网。突破网络审查。例如,帮助用户访问受到地理限制或内容审查的网站。提高网络性能。例如,通过缓存技术减少数据传输延迟和带宽使用。使用正向代理时,客户端需要进行一些特别的设置,例如配置代理服务的地址、端口、账号密码等。正向代理对服务端是透明的,即服务端通常不知道请求实际上是由代理服务器发出的。
-
反向代理
- 反向代理,其实客户端对代理是无感的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器ip地址
- 正向代理代理的是客户端,隐藏了客户端的真正ip,防止黑客攻击,反向代理则代理的是服务端
-
-
负载均衡
- 客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的部端增长,访问量和数据量飞速增长,以及系统业务的复杂度也增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?
- 单个服务器解决不了,我们可以增加服务器的数量,然后将请求分发到各个服务器上,将原先集中到单个服务器的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们说的负载均衡。
-
动静分离
- 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。
-
- nginx命令和配置文件
- nginx常用命令(Linux环境下)
- 使用nginx操作命令前提条件:必须进入nginx的目录
- 1.查看版本号 ./nginx -v
- 2.启动nginx ./nginx
- 3.关闭nginx ./nginx -s stop
- 4.重新加载nginx ./nginx -s reload
- 5.查看nginx当前状态 ps -ef | grep nginx
- nginx配置文件
- nginx配置文件在 */usr/local/nginx/conf/nginx.conf
- 配置文件组成部分,三部分
- 全局块
- 从配置文件开始到events块之间的内容都是全局块,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。
- 比如下面第一行配置的worker process。这是nginx服务器并发处理服务的关键配置,worker process值越大,可以支持的并发处理量也越多,但是会收到硬件、软件等设备的制约。
- events块
- events块涉及的指令主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个worker process 可以同时支持的最大连接数等。
- 上图例子就表示每个worker process支持的最大连接数为1024。这部分的配置对nginx的性能影响较大,在实际中应该灵活配置。
- http块
- http块是nginx服务配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http块也可以包括http全局块、server块。
- 1.http全局块
- http全局块配置的指令包括文件引入、MIME-TYPE定义、连接超时间、单链接请求数上限等。见下图
- server块
- 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
- 每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。
- 而每个server块也分为全局server块,以及可以同时包含多个location块。
- 1.全局server块 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置
- 2.location块 一个server块可以配置多个location块。这个块的主要作用是基于nginx服务器接收到的请求字符串,对虚拟主机名称之外的字符串进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行
-
# 表示如果请求路径是/就是用这个location块进行处理 location / { root html; index index.html index.htm; }
- 全局块
- nginx常用命令(Linux环境下)
- location 指令说明:
- 该指令用于匹配URL语法如下:
- 1.= :用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求
- 2 ~ : 用于表示uri包含正则表达式,并且区分大小写
- 3.~* :用于表示uri包含正则表达式并且不区分大小写
- 4.^~ : 用于不含正则表达式的uri之前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
- 注意:如果uri包含正则表达式,则必须要有~或~*标识。
-
在Nginx中,location块用于定义如何处理特定的请求URI。location块里可以使用的指令有很多,以下是一些常用的指令及其作用:
root:设置请求URI对应的文件所在的根目录路径。
alias:为请求URI指定一个别名,使得Nginx可以在不同的文件系统路径下寻找资源。
index:设置当请求URI为目录时,默认显示的文件列表。
try_files:按顺序检查文件或者目录是否存在,并返回第一个找到的文件或者目录。
rewrite:用于URL重写。
proxy_pass:将请求转发到后端服务器。
fastcgi_pass:将请求转发给FastCGI应用(例如PHP)。
以下是一个简单的location块配置实例:
server {
listen 80;
server_name example.com;
root /var/www/html;
location / {
index index.html index.htm;
}
location /images/ {
root /var/www/images;
}
location ~* \.(jpg|jpeg|png)$ {
root /var/www/images;
expires 30d;
}
location /api/ {
proxy_pass http://backend_server;
}
location /phpmyadmin/ {
alias /usr/share/phpmyadmin/;
}
location /download/ {
try_files $uri $uri/ =404;
}
location /oldsite.com/ {
rewrite ^/oldsite.com/(.*)$ /newsite.com/$1 permanent;
}
}在这个配置中,我们定义了几个location块,它们分别处理不同类型的请求URI。例如,第一个location块处理根目录的请求,第二个location块处理/images/路径下的图片请求,并且使用expires头设置了缓存时间。第三个location块将对PHPMyAdmin的请求指向到文件系统中的相应目录。第四个location块尝试为下载请求提供文件,如果文件不存在则返回404错误。最后一个location块将旧站点的请求重定向到新站点。
简单负载均衡配置示例
nginx负载均衡分配策略:
1.轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
2.weight
weight代表权重,默认为1,权重越高被分配的客户端越多
指定轮询几率,weight和访问率成正比,用于后端服务器性能不均的情况,例如
upstream sever_pool{
server 192.168.5.21 weight=10;
server 192.168.5.22 weight=10;
}
3.IP hash
每个请求按ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session共享问题,例如(让你的用户指定访问某一个服务器)
upstream sever_pool{
ip_hash
server 192.168.5.21:80
server 192.168.5.22:80
}
4.fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的有限分配
upstream sever_pool{
server 192.168.5.21:80
server 192.168.5.22:80
fair
}
动静分离配置
nginx东京分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用nginx处理静态页面,tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。
通过location只当不同的域名实现不同的请求转发,通过expires参数设置,可以设置浏览器缓存过期时间,减少与服务器之间请求和流量。具体expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用expires来缓存),我这里设置3d,表示在这3天之内访问这个url,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200
location /www/ {
root /data/;
index index.html index.htm
}
location /image/ {
root /data/;
autoindex on; #配置这个会列出当前文件夹中的内容
}
配置高可用集群
1.什么是nginx高可用
1)需要两台nginx服务器
2)需要keepalived
3)需要虚拟IP
2.配置高可用的准备工作
1)需要两台服务器
2)在两台服务器安装nginx
3)在两台服务器安装keepalived
安装之后,在etc里面生成目录keepalived,有文件keepalived.conf
3.完成高可用配置(主从配置)
global_defs {
notification_email{
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notifycation_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
stmp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_post{
script "/user/local/srcnginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp instance VI1{
state MASTER #备份服务器上将 MASTER改为BACKUP
interface ens33//网卡
virtual router id 51 #主、备机的virtual router id必须相同
priority 100 #主、备机取不同的优先级,主机值较大,备份机值较小
advert int 1
authentication {
auth type PAss
auth pass 1111
}
virtual_ipaddress{
192.168.17.50 //VRRP H拟地址