nginx学习笔记

nginx(engine x)是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强。本文是基于ubuntu系统对nginx进行安装和使用的。

一、nginx的安装和使用

1. 安装

sudo apt-get install nginx
nginx -v # 查看是否安装成功

安装和启动过程中碰到两个问题,一是日志和错误日志没权限的问题,可以通过sudo chmod 777 access.log命令修改权限,二是启动时报权限错误问题,可以改用sudo nginx启动。

2. 目录说明

  • /usr/sbin/nginx:主程序
  • /etc/nginx:存放配置文件
  • /usr/share/nginx:存放静态文件
  • /var/log/nginx:存放日志

3. 使用

(1) 启动

有两种方式可以启动nginx:

  • 进入/usr/sbin目录,执行sudo nginx命令,当已经添加环境变量(会自动添加)后,可在任意目录下执行该命令

  • 使用service nginx start命令启动

(2) 访问

启动成功后,先用ifconfig命令查看Linux系统的IP地址,然后在Windows的浏览器中访问该IP地址,看到nginx页面说明启动成功

在Windows下访问Linux下的nginx,默认是不能访问的,因为有防火墙的存在,所以需要设置防火墙的开放端口

  • 安装防火墙:apt install firewalld
  • 查看开放的端口号:firewall-cmd --list-all
  • 设置开放的端口号:
    • firewall-cmd --add-service=http --permanent
    • sudo firewall-cmd --add-port=80/tcp --permanent
  • 重启防火墙:firewall-cmd --reload

(3) 常用命令

  • nginx -v:查看版本号
  • nginx -s stop:关闭nginx
  • nginx:启动nginx
  • nginx -s reload:更改nginx.conf配置文件后重加载nginx

二、nginx的配置文件

配置文件由全局块、events块、http块组成

1. 全局块

主要设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组)、允许生成的worker processes数、进程PID存放路径、日志存放路径和类型以及配置文件的引入等。worker processes值越大,可以支持的并发处理量也越多

2. events块

涉及的指令主要会影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事务驱动模型来处理连接请求,每个work process可以同时支持的最大连接数等

例如:worker connections 1024支持的最大连接数

3. http块

是配置的最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。http块也可以包括http全局块和server块

(1) http全局块

其指令包含文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单连接请求数上限等

(2) server块

和虚拟主机有密切联系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。每个http块可以包括多个server块,每个server块将相当于一个虚拟主机。

server块可以分为全局server块,以及可以同时包含多个location块

i) 全局server块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称和IP配置

ii) location块

一个server块可以配置多个location块。其作用是基于nginx服务器接收到的请求字符串,对虚拟机名称之外的字符串进行匹配,对特定的请求进行处理,地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

三、反向代理

1. 正向代理

nginx学习笔记_第1张图片

在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问

2. 反向代理

nginx学习笔记_第2张图片

只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对望就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

3. tomcat的安装

  • 首先安装java的jdk环境
  • 下载tomcat安装包并解压,由于后面要用到两个不同端口的tomcat,所以分别命名为tomcat8080和tomcat8081
  • tomcat8081/conf/server.xml中将端口号修改为8081
  • tomcat8081/bin中使用bash startup.sh启动tomcat,使用bash shutdown.sh关闭
  • 使用ps -ef|grep tomcat查看tomcat是否启动成功
  • 在浏览器访问localhost:8081查看是否能访问成功

4. 实例1

(1) 实现效果

在Windows系统的浏览器中访问www.123.com,跳转到Linux系统下的tomcat主页面

(2) 准备工作

  • 安装java的jdk环境和tomcat,并启动tomcat
  • 使用命令让nginx开放tomcat的8080端口
    • firewall-cmd --add-port=8080/tcp --permanent
    • firewall-cmd --reload
  • 查看已经开放的端口号firewall-cmd --list-all
  • 在Windows下访问服务器端的tomcat主页Linux系统IP地址:8080,看是否能正常访问

(3) 访问过程分析

(4) 具体配置

  • 在Windows系统下的C:\Windows\System32\drivers\etc\hosts文件中配置域名和IP的对应关系,添加Linux系统IP地址 www.123.com

  • 在nginx的配置文件中的http块中添加server块

    server {
        listen 80;
        server_name 192.168.114.129; # 服务器IP地址
    
        location / {
            root html;
            proxy_pass http://127.0.0.1:8080; # Windows端访问的地址
            index index.html index.htm;
        }
    }
    
  • 重新加载配置文件nginx -s reload

补充:

location [ = | ~ | ~* | ^~] uri {

}

1、=: 用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,
	就停止继续向下搜索并立即处理该请求
2、~: 用于表示uri包含正则表达式,并且区分大小写
3、~*: 用于表示uri包含正则表达式,并且不区分大小写
4、^~: 用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字
	符串匹配度最高的location后,立即使用此location处理请求,而不再使用location
	块中的正则uri和请求字符串做匹配
注意: 如果uri包含正则表达式,则必须要有~或者~*标识。

(5) 最终测试

进行请求转发的配置(反向代理配置),在Windows下访问指定网址www.123.com

5. 实例2

(1) 实现效果

使用nginx反向代理,根据访问的路径跳转到不同端口的服务中,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

(2) 准备工作

  • 准备两个tomcat服务器,一个8080端口,一个8081端口

  • tomcat8080/webapps下创建名为edu的文件夹,在tomcat8081/webapps下创建名为vod的文件夹

  • 在两个文件夹下分别添加测试页面a.html

    <h1>
        8080!!!
    h1>
    
    <h1>
        8081!!!
    h1>
    
  • 在Windows系统下分别访问http://192.168.114.129:8080/edu/a.htmlhttp://192.168.114.129:8081/vod/a.html,查看是否能访问成功

(3) 具体配置

  • 修改nginx的配置文件,在http块中添加server块

    server {
        listen 9001;
        server_name 192.168.114.129;
    
        location ~ /edu/ {
            proxy_pass http://127.0.0.1:8080;
        }
        
        location ~ /vod/ {
            proxy_pass http://127.0.0.1:8081;
        }
    }
    
  • 开放9001、8080、8081号端口

(4) 最终测试

在Windows下访问http://192.168.114.129:9001/edu/a.htmlhttp://192.168.114.129:9001/vod/a.html

四、负载均衡

1. 负载均衡

nginx学习笔记_第3张图片

将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器

2. 实例

(1) 实现效果

在Windows系统浏览器访问http://服务器IP地址/edu/a.html,负载均衡效果,平均到8080和8081端口中

(2) 准备工作

  • 准备两台tomcat服务器,一台8080,一台8081

  • 在两台tomcat里面webapps目录中,创建名称是edu的文件夹,并在里面创建一个a.html文件

(3) 具体配置

  • 在http块中添加upstream 名字子块

    upstream myserver{
    	ip_hash;
    	server http://192.168.114.129:8080 weight=1;
    	server http://192.168.114.129:8081 weight=1;
    }
    
  • 在http块中添加server子块

    server {
        listen 80;
        server_name 192.168.114.129; # 服务器IP地址
    
        location / {
            root html;
            proxy_pass http://myserver; # Windows端访问的地址,myserver对应upstream块的名称
            index index.html index.htm;
        }
    }
    

(4) nginx分配服务器策略

  • 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除

  • weight:权重越高被分配的客户端越多,权重默认为1

  • ip_hash:每个请求按访问ip的hash结果分配,这样每个方可固定访问一个后端服务器

  • fair(第三方):按后端服务器的响应来分配请求,响应时间短的优先分配

(5) 最终测试

在Windows下多次访问http://服务器IP地址/edu/a.html,会显示不同的服务器下a.html的内容

五、动静分离

1. 动静分离

nginx学习笔记_第4张图片

为加快网站解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务的压力。不能理解成只是单纯的把动态页面和静态页面物理分离,而是动态请求和静态请求分开,可以理解为使用Nginx处理静态页面,使用tomcat处理动态页面。

2. 实例

(1) 准备工作

在Linux系统中准备一些静态资源,用于进行访问

  • 分别创建/data/www/data/image文件夹
  • /data/www中放一个a.html文件,在/data/image存放一张图片1.jpg

(2) 具体配置

在Nginx配置文件中进行配置,在http块中添加server子块

server {
    listen 80;
    server_name 192.168.114.129;

    location /www/ {
        root /data/;
        index index.html index.htm;
    }
    
    location /image/ {
        root /data/;
        autoindex on; # 
    }
}

(3) 最终测试

  • 在浏览器中访问http://服务器IP地址/image

  • 在浏览器中访问http://服务器IP地址/www

六、高可用

1. 高可用

nginx学习笔记_第5张图片

只配置一台nginx时,通过nginx将请求分发到不同的服务器,但是一旦nginx宕机后,就不能正常进行请求了。高可用状态下配置多台nginx,并对外暴露一个共同的虚拟IP,当主服务器宕机后,就主动切换到备份服务器。

  • 需要两台服务器
  • 需要keepalived
  • 需要虚拟IP

2. 实例

(1) 准备工作

  • 准备两台服务区192.168.17.129192.168.17.131
  • 在两台服务器上安装nginx
  • 在两台服务器上安装keepalived

(2) 安装keepalived

# 安装相关依赖
apt-get update && apt-get upgrade
apt-get install libpop-dev
apt-get install daemon

# 下载并安装keeepalived
wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz
tar -xzvf keepalived-1.2..tar.gz
cd  keepalived-1.2.
./configure --prefix=/usr/local/keepalived
make
make install

安装后keepalived.conf文件是keepalived的配置文件

(3) 完成高可用配置(主从配置)

  • 更改keepalived的配置文件

    # 全局配置
    global_defs {
    	notification_email {
    	  [email protected]
    	  [email protected]
    	  [email protected]
    	}
    	notification_email_from [email protected]
    	smtp_ server 192.168.17.129
    	smtp_connect_timeout 30
    	router_id LVS_DEVEL	# LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
    }
    
    # 脚本
    vrrp_script chk_http_ port {
    	script "/usr/local/src/nginx_check.sh"
    	interval 2   # (检测脚本执行的间隔)2s
    	weight 2  #权重,如果这个脚本检测为真,服务器权重+2
    }
    
    # 虚拟IP
    vrrp_instance VI_1 {
    	state BACKUP   # 备份服务器上将MASTER 改为BACKUP
    	interface ens33 //网卡名称
    	virtual_router_id 51 # 主、备机的virtual_router_id必须相同
    	priority 100   #主、备机取不同的优先级,主机值较大,备份机值较小
    	advert_int 1	#每隔1s发送一次心跳
    	authentication {	# 校验方式, 类型是密码,密码1111
            auth type PASS
            auth pass 1111
        }
    	virtual_ipaddress { # 虛拟ip
    		192.168.17.50 // VRRP H虛拟ip地址
    	}
    }
    
  • nginx_check.sh放到指定目录/usr/local/src

    #!/bin/bash
    A=`ps -C nginx –no-header |wc -l`
    if [ $A -eq 0 ];then
        /usr/local/nginx/sbin/nginx
        sleep 2
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
            killall keepalived
        fi
    fi
    

(4) 启动

  • 使用命令sudo nginx启动nginx
  • 使用命令systemctl start keepalived.service启动keepalived

(5) 最终测试

  • 在Windows下访问虚拟IP地址192.168.17.50
  • 使用systemctl stop keepalived.service关闭主服务器,再次访问虚拟IP地址

七、nginx原理

1. master和worker

nginx学习笔记_第6张图片

一个master下面有多个worker

2. worker如何工作

nginx学习笔记_第7张图片

客户端发送请求后master将请求给worker,worker通过争抢的方式得到任务,并调用tomcat完成任务。

3. 一master多worker的优点

  • 可以使用nginx -s reload进行热部署
  • 每个worker都是独立的进程,如果有其中的一个worker出现问题,其他worker可以继续进行争抢,实现请求过程,不会造成服务中断

4. 设置多少个worker合适

worker数和服务器的CPU数相等是最为适宜的,即4核CPU设置4个worker

# 设置worker数量
worker.processes 4 

# work绑定cpu(4work绑定4cpu)
worker_cpu_affinity 0001 0010 0100 1000

# work绑定cpu (4work绑定8cpu中的4个)
worker_cpu_affinity 0000001 00000010 00000100 00001000

5. 连接数worker_connection

  • 发送请求占用了worker的几个连接数?

    2个或4个,2个静态资源的请求和响应,2个tomcat的请求和响应

  • nginx有1个master,4个worker,每个worker支持的最大连接数为1024,支持的最大并发数是多少?

    普通的静态访问最大并发数为:worker数 * worker最大连接数 / 2,而如果是http作为反向代理,则最大并发数为worker数 * worker最大连接数 / 4

你可能感兴趣的:(Java后端开发,nginx,nginx反向代理,linux,分布式,java)