nginx(engine x)是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强。本文是基于ubuntu系统对nginx进行安装和使用的。
sudo apt-get install nginx nginx -v # 查看是否安装成功
安装和启动过程中碰到两个问题,一是日志和错误日志没权限的问题,可以通过sudo chmod 777 access.log
命令修改权限,二是启动时报权限错误问题,可以改用sudo nginx
启动。
/usr/sbin/nginx
:主程序/etc/nginx
:存放配置文件/usr/share/nginx
:存放静态文件/var/log/nginx
:存放日志有两种方式可以启动nginx:
进入/usr/sbin
目录,执行sudo nginx
命令,当已经添加环境变量(会自动添加)后,可在任意目录下执行该命令
使用service nginx start
命令启动
启动成功后,先用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
nginx -v
:查看版本号nginx -s stop
:关闭nginxnginx
:启动nginxnginx -s reload
:更改nginx.conf配置文件后重加载nginx配置文件由全局块、events块、http块组成
主要设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行nginx服务器的用户(组)、允许生成的worker processes数、进程PID存放路径、日志存放路径和类型以及配置文件的引入等。worker processes值越大,可以支持的并发处理量也越多
涉及的指令主要会影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事务驱动模型来处理连接请求,每个work process可以同时支持的最大连接数等
例如:worker connections 1024
支持的最大连接数
是配置的最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。http块也可以包括http全局块和server块
其指令包含文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单连接请求数上限等
和虚拟主机有密切联系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。每个http块可以包括多个server块,每个server块将相当于一个虚拟主机。
server块可以分为全局server块,以及可以同时包含多个location块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称和IP配置
一个server块可以配置多个location块。其作用是基于nginx服务器接收到的请求字符串,对虚拟机名称之外的字符串进行匹配,对特定的请求进行处理,地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对望就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
tomcat8081/conf/server.xml
中将端口号修改为8081tomcat8081/bin
中使用bash startup.sh
启动tomcat,使用bash shutdown.sh
关闭ps -ef|grep tomcat
查看tomcat是否启动成功localhost:8081
查看是否能访问成功在Windows系统的浏览器中访问www.123.com,跳转到Linux系统下的tomcat主页面
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all
Linux系统IP地址:8080
,看是否能正常访问在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包含正则表达式,则必须要有~或者~*标识。
进行请求转发的配置(反向代理配置),在Windows下访问指定网址www.123.com
使用nginx反向代理,根据访问的路径跳转到不同端口的服务中,nginx监听端口为9001
准备两个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.html
和http://192.168.114.129:8081/vod/a.html
,查看是否能访问成功
修改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号端口
在Windows下访问http://192.168.114.129:9001/edu/a.html
和http://192.168.114.129:9001/vod/a.html
将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器
在Windows系统浏览器访问http://服务器IP地址/edu/a.html
,负载均衡效果,平均到8080和8081端口中
准备两台tomcat服务器,一台8080,一台8081
在两台tomcat里面webapps目录中,创建名称是edu的文件夹,并在里面创建一个a.html文件
在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; } }
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
weight:权重越高被分配的客户端越多,权重默认为1
ip_hash:每个请求按访问ip的hash结果分配,这样每个方可固定访问一个后端服务器
fair(第三方):按后端服务器的响应来分配请求,响应时间短的优先分配
在Windows下多次访问http://服务器IP地址/edu/a.html
,会显示不同的服务器下a.html的内容
为加快网站解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务的压力。不能理解成只是单纯的把动态页面和静态页面物理分离,而是动态请求和静态请求分开,可以理解为使用Nginx处理静态页面,使用tomcat处理动态页面。
在Linux系统中准备一些静态资源,用于进行访问
/data/www
和/data/image
文件夹/data/www
中放一个a.html文件,在/data/image
存放一张图片1.jpg在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; # } }
在浏览器中访问http://服务器IP地址/image
在浏览器中访问http://服务器IP地址/www
只配置一台nginx时,通过nginx将请求分发到不同的服务器,但是一旦nginx宕机后,就不能正常进行请求了。高可用状态下配置多台nginx,并对外暴露一个共同的虚拟IP,当主服务器宕机后,就主动切换到备份服务器。
192.168.17.129
和192.168.17.131
# 安装相关依赖 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的配置文件
更改keepalived的配置文件
# 全局配置 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 # 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
sudo nginx
启动nginxsystemctl start keepalived.service
启动keepalived192.168.17.50
systemctl stop keepalived.service
关闭主服务器,再次访问虚拟IP地址一个master下面有多个worker
客户端发送请求后master将请求给worker,worker通过争抢的方式得到任务,并调用tomcat完成任务。
nginx -s reload
进行热部署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
发送请求占用了worker的几个连接数?
2个或4个,2个静态资源的请求和响应,2个tomcat的请求和响应
nginx有1个master,4个worker,每个worker支持的最大连接数为1024,支持的最大并发数是多少?
普通的静态访问最大并发数为:worker数 * worker最大连接数 / 2
,而如果是http作为反向代理,则最大并发数为worker数 * worker最大连接数 / 4