nginx配置及实例
- 1、 nginx常用命令
- 2、 nginx配置文件
- 3、 localtion说明
- 4、 nginx配置-反向代理实例1
- 5、 nginx配置-反向代理实例2
- 5、 nginx配置-负载均衡-nginx提供的几种分配方式(策略):
- 6、 nginx配置-负载均衡实例
- 6、 nginx配置-动静分离
- 7、 nginx配置-高可用实例(nginx配置高可用集群)
- 8、 nginx配置-原理
1、 nginx常用命令
使用nginx操作命令的前提条件就是:必须进入nginx的目录
cd /user/local/nginx/sbin
- 查看版本号
./nginx-v
- 启动nginx
./nginx
- 关闭nginx
./nginx-s stop
- 重新加载nginx-----不重启服务器,重新加载配置文件,配置生效
./nginx-s reload
2、 nginx配置文件
nginx配置文件位置:/user/local/nginx/conf/nginx.conf,通过vi nginx.conf命令打开配置文件,nginx配置文件由三部分组成
- 第一部分: 全局块:从配置文件开始到events块之间的内容,主要设置一些影响nginx服务器整体运行的配置指令。主要包括配置运行nginx服务器的用户(组)、允许生成的worker process数,进程pid存放路径、日志存放路径和类型以及配置文件的引入等
- 第二部分:events块:events块所涉及的指令主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多worker processe下的网络链接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动来处理连接请求,每个worker_processe可以同时支持最大的连接数等。这部分的配置对nginx的性能的影响较大,实际中应灵活配置
- 第三部分:http块:是nginx服务器配置中最频繁的部分,代理、缓存、和日志定义等绝大多数功能和第三方模块的配置都这,反向代理、负载均衡、动静分离、高可用都在这配(注意:http块包括http全局块、server块)
#第一部分: 全局块:从配置文件开始到events块之间的内容,主要设置一些影响nginx服务器整体运行的配置指令。
#主要包括配置运行nginx服务器的用户(组)、允许生成的worker process数,进程pid存放路径、日志存放路径和类型以及配置文件的引入等
# user nginx;
worker_processes 1; #nginx服务器并发处理服务的关键配置,值越大,可以支持的并发处理越多,但会受到硬件、软件等设备的制约
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
#第二部分:events块:events块所涉及的指令主要影响nginx服务器与用户的网络连接,常用的设置包括是否开启对多worker processe下的网络链接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动来处理连接请求,每个worker_processe可以同时支持最大的连接数等.
#这部分的配置对nginx的性能的影响较大,实际中应灵活配置
events {
worker_connections 1024; #每个worker_processe可以同时支持最大的连接数为1024
}
#第三部分:http块:是nginx服务器配置中最频繁的部分,代理、缓存、和日志定义等绝大多数功能和第三方模块的配置都这,反向代理、负载均衡、动静分离、高可用都在这配
#注意:http块包括http全局块、server块
http {
#http全局块 :http全局块配置的指令包括文件引入、 MIME-TYPE定义、日志自定义、连接超时时间、单链接请求上限等
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server_tokens off;
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 300;
proxy_max_temp_file_size 0;
send_timeout 3600;
proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时)
#client_max_body_size 200m;
gzip on;
#include /etc/nginx/conf.d/*.conf;
#server块:server和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
#每个http块可以包含多个server块,而每个server块就相当于一个虚拟主机
#每个server块也分为全局server块,以及可以同时包含多个location块
server {
listen 8095; #nginx目前监听的端口号是8095端口
server_name localhost; #主机名称
include /etc/nginx/conf.d/server.conf;
location ^~/user/{
proxy_pass '$USER';
}
location ^~/service/{
proxy_pass '$SERVICE';
}
location /{
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
root /opt/apps/dist;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
}
3、 localtion说明
该指令用于匹配URL
语法如下:
location [ = | ~ | ~* | ^~] uri {
}
- =:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求
- ~:用于表示uri包含正则表达式,并且区分大小写
- ~*:用于表示uri包含正则表达式,并且不区分大小写
- ^~:用于不含正则表达式的uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即处理此location请求,而不再使用location块中的正则uri和请求字符串做匹配
- 注:如果uri包含正则表达式,则必须要有 ~ 或者 ~* 标识
4、 nginx配置-反向代理实例1
(1)实现效果:
- 打开浏览器,在浏览器地主栏输入地址www.123.com,跳转至linux系统的tomcat主页面中
- 补充: - 打开浏览器,在浏览器地主栏输入一个域名(比如www.baidu.com)的匹配规:先去windows系统下(本地)的host文件中寻找看是否有相应的配置,如果有的话先根据host文件中的配置执行,如果没有的话到网络上找DNS域名解服务器找网通ip进行解析执行。
(2) 准备工作:
- 在linux系统上安装tomcat,使用默认端口8080启动
*tomcat安装文件放到linux系统中,解压
*进入tomcat的bin目录中,./startup.sh启动tomcat服务器 - 对外开放访问端口(linux系统中默认并不是所有端口都开放,需要设置防火墙,加上开放规则,并重新加载防火墙)
*firewall-cmd --add-port=8080/tcp --permanent 开放8080端口
*firewall-cmd-reload 重新加载防火墙
*firewall-cmd --list-all 查看已经开放的端口 - (3) 在客户端windows系统中通过浏览器访问linux系统中的tomcat:
- 在浏览器地主栏输入地址www.123.com,跳转至linux系统的tomcat主页面中访问过程分析
- (4)具体配置
- 在windows系统的host文件进行域名和ip对应关系的配置
- 添加内容在host文件中(ip 域名)
- 具体配置
http {
server {
listen 80; #nginx目前监听的端口号是80端口
server_name 192.168.17.129; #主机名称
include /etc/nginx/conf.d/server.conf;
location /{ #当访问192.168.17.129:80时相当于192.168.17.129:80/,会转发到'http://172.0.0.1:8080'
#最终的结果就是,浏览器上访问www.123.com本地解析到192.168.17.129:80,然后通过nginx转发到http://172.0.0.1:8080
proxy_pass 'http://172.0.0.1:8080';
}
}
}
5、 nginx配置-反向代理实例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) 准备工作:
- 在linux系统上安装两个tomcat,分别使用端口8080及8081启动,并开放9001、8080及8081端口
- 分别在tomcat服务器中创建文件夹(edu、vod),并分别在文件夹内创建测试界面(a.thml<一个写的是用h标签包裹的8080数字,一个的是用h标签包裹的8081数字>)
(3)具体配置
- 在windows系统的host文件进行域名和ip对应关系的配置
- 添加内容在host文件中(ip 域名)
- 具体配置
http {
server {
listen 9001; #nginx目前监听的端口号是9001端口
server_name 192.168.17.129; #主机名称
include /etc/nginx/conf.d/server.conf;
#注意 ~/edu/是正则表达式的形式
location ~/edu/{
#最终的结果就是,浏览器上访问www.123.com本地解析到192.168.17.129:9001,然后通过nginx转发到http://172.0.0.1:8080
proxy_pass 'http://172.0.0.1:8080';
}
location ~/vod/{
#最终的结果就是,浏览器上访问www.123.com本地解析到192.168.17.129:9001,然后通过nginx转发到http://172.0.0.1:8081
proxy_pass 'http://172.0.0.1:8081';
}
}
}
(4)测试
- 访问http://192.168.17.129:9001/edu/a.html
- 访问http://192.168.17.129:9001/vod/a.html
5、 nginx配置-负载均衡-nginx提供的几种分配方式(策略):
(1)轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
(2)weight
weight代表权重,默认为1,权重越高被分配的客户端越多。
– 指定轮询几率,weight和访问率成正比,用于后端服务器性能不均的情况
(3)ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题
(4)fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配
6、 nginx配置-负载均衡实例
(1)实现效果:
- 浏览器地址栏输入地址http://192.168.17.129/edu/a.html,负载均衡效果,平均8080和8081端口中
(2) 准备工作: - 在linux系统上安装两个tomcat,分别使用端口8080及8081启动,并开放8080及8081端口
- 分别两台在tomcat服务器中webapps目录中。创建名称是edu的文件夹,在edu文件夹中创建页面a.html(一个写的8080,一个写的8081),用于测试
(3)具体配置
在http块中加一个 upstream ,请求代理地址写upstream的自定义的名
http {
......
#------------------重点--------------需要加 upstream 并起名 myserver
upstream myserver{
ip_hash
server 192.168.17.129:8080 weight=1;
server 192.168.17.129:8081 weight=1;
# fair
}
server {
listen 80; #nginx目前监听的端口号是80端口
server_name 192.168.17.129; #主机名称
location /{
proxy_pass 'http://myserver': #--------重点---------这里填写的是自己定义的upstream名:myserver
}
}
......
}
(4)测试
- 因为监听端口是80端口,可以省略,所以直接访问ip即可
- 访问http://192.168.17.129/edu/a.html,每次请求该地址,nginx都会将请求平均分散到8080以及8081服务器上
6、 nginx配置-动静分离
(1)什么是动静分离
nginx动静分离简单来说就是把动态请求跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。可以理解成nginx处理静态页面,tomcat处理动态页面。
动静分离从实现角度大致分为两种:
- 纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推荐的方案
- 动态跟静态文件混合在一起发布,通过nginx来分开
通过location指定不同的请求转发,通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之间的请求和流量,具体expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,故不会产生额外的流量(此方法适合不经常变动的资源,如果是经常变动不建议使用expires来缓存),如果设置3d,表示这三天之内访问这个url,发送一个请求。对比服务器该文件最新更新时间,如果没有变化则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
(2)准备工作
- 在linux系统中准备静态资源,用于进行访问
根目录下创建data文件夹,并在data下创建www文件夹(放一个html页面-内容是:test html !!)以及image文件夹(放一个01.jpg)
(3)具体配置
http {
......
server {
listen 80; #nginx目前监听的端口号是80端口
server_name 192.168.17.129; #主机名称
location /www/{
root /data/; #访问data目录下的资源
index index.html index.htm;
}
location /image/{
root /data/; #访问data目录下的资源
autoindex on; #列出你当前文件夹的内容
}
}
......
}
(4)测试
- 浏览器中输入地址:http://192.168.17.129/image/ nginx中配置image时有autoindex on,故列出文件夹中的内容
- 浏览器中输入地址:http://192.168.17.129/www/ nginx中配置www时没有配置autoindex on,故不会列出文件夹中的内容;http://192.168.17.129/www/a.html可出现页面
7、 nginx配置-高可用实例(nginx配置高可用集群)
问题1:tomcat宕机影响不大(一般配置多个tomcat服务,宕机可用其它的),但nginx宕机,则请求无法实现
(1)nginx高可用(设置一台主服务器,一台备份服务器(也叫从服务器)。优先使用主服务器,如果主服务器宕机自动切换到备份服务器继续工作,需要使用keepalived这个软件,相当一个路由,通过脚本检测当前绑定的服务器是否还活着,如果活着就用当前服务器,如果宕机了就切换到其它服务器,访问的nginx地址是一个虚拟ip,keepalive作用就是将虚拟ip绑定到当前能用的服务器)
(2)配置高可用准备工作
- 需要两台服务器(192.168.17.129 || 192.168.17.131 )
- 在两台服务器中安装nginx
- 在两台服务器中安装keepalived(在etc里面生成目录keepalived,有文件keepalived.conf)
(3)完成高可用配置(主要是修改keepalived.conf)
- 需要两台服务器(192.168.17.129 || 192.168.17.131 )
- 在两台服务器中安装nginx
- 在两台服务器中安装keepalived(在etc里面生成目录keepalived,有文件keepalived.conf)
! Configuration File for keepalived
#全局定义模块
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc #邮件报警,可以不设置,后期nagios统一监控。
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129 ##服务器ip 192.168.17.129 或者 192.168.17.131
smtp_connect_timeout 30
router_id LVS_DEVEL #此处注意router_id为负载均衡标识,在局域网内应该是唯一的,通过LVS_DEVEL应该能访问到主机或者服务器,在host文件中设置(etc/hosts文件)如下放配置router_id截图。
}
# 脚本
vrrp_script chk_http_port{
script "/user/local/src/nginx_check.sh" #需要执行的脚本
interval 2 # 检测脚本执行的间隔
weight -20 # 权重(当脚本中条件成立,则把当前服务器权重降低20)
}
#VRRP实例定义块 ---虚拟rp模块
vrrp_instance VI_1 {
state MASTER #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态。
interface ens33 #网卡
lvs_sync_daemon_inteface eth0 #这个默认没有,相当于心跳线接口,DR模式用的和上面的接口一样,也可以用机器上的其他网卡eth1,用来防止脑裂。
virtual_router_id 51 #虚拟路由标识,同一个vrrp_instance的MASTER和BACKUP的vitrual_router_id 是一致的。
priority 100 #优先级,同一个vrrp_instance的MASTER(一般设置100)优先级必须比BACKUP高。
advert_int 1 #MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒,每隔这一段时间发送一次心跳,检测该服务器是否还活着。
authentication { #权限校验方式
auth_type PASS #验证authentication。包含验证类型和验证密码。类型主要有PASS、AH 两种,通常使用的类型为PASS(密码方式),\
auth_pass 1111 #(表示密码是1111)据说AH 使用时有问题。验证密码为明文,同一vrrp 实例MASTER 与BACKUP 使用相同的密码才能正常通信。
}
virtual_ipaddress { #虚拟ip地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的vip 相一致!
192.168.17.50
# 192.168.200.101
# 192.168.200.102
}
}
#虚拟服务器定义块
# virtual_server 192.168.200.100 443 { #虚拟IP,来源与上面的虚拟IP地址,后面加空格加端口号
# delay_loop 6 #健康检查间隔,单位为秒
# lb_algo rr #负载均衡调度算法,一般用wrr、rr、wlc
# lb_kind NAT #负载均衡转发规则。一般包括DR,NAT,TUN 3种。
# persistence_timeout 50 #会话保持时间,会话保持,就是把用户请求转发给同一个服务器,不然刚在1上提交完帐号密码,就跳转到另一台服务器2上了。
# protocol TCP #转发协议,有TCP和UDP两种,一般用TCP,没用过UDP。
# real_server 192.168.201.100 80 { #真实服务器,包括IP和端口号
# weight 1 #权重,数值越大,权重越高
# TCP_CHECK { #通过tcpcheck判断RealServer的健康状态
# connect_timeout 3 #连接超时时间
# nb_get_retry 3 #重连次数
# delay_before_retry 3 #重连时间间隔
# connect_port 80 #检测端口
}
}
}
- 在 /user/local/src/目录下添加检测脚本/nginx_check.sh
###/nginx_check.sh 检测脚本
A = `ps -C nginx -no-header |wc -l`
if [ $A -eq 0];then
/user/local/ngnix/sbin/ngnix ##nginx启动路径
sleep 2
if [ `ps -C nginx -no-header |wc -l` -eq 0];then
killall keepalived
fi
fi
- 两台服务器上都启动nginx( ./nginx )以及keepalived( systemctl.start keepalived service )
- 配置文件详解截图
<1>配置router_id截图
(4)测试高可用 - 浏览器中输入虚拟ip地址:http://192.168.17.50(可看到nginx界面,故虚拟ip已绑定) - 把主服务器(192.168.17.129)的ngnix和keepalived停止,继续输入虚拟ip地址:http://192.168.17.50(可显示nginx,且虚拟ip已绑定,故已自动切换至 从服务器也就是备份服务器)
8、 nginx配置-原理
- master进程(分配工作任务、管理)
- worker进程(实施工作任务–争抢机制)
- 一个master和多个worker的好处
(1)可以使用nginx-s reload热部署,利用nginx进行热部署操作
(2)每个worker是独立的进程,如果其中的一个worker出现问题,其他的worker独立的,继续进行争抢,实现请求工程,不会造成服务中断 - 设置多少worker最合适
每个worker的线程可以把一个cpu的性能发挥到极致,所以worker数和服务器的cpu数相等最为适宜 - 连接数worker_connection
(1)发送一个请求占用worker的2个或者4个连接数,如果是静态资源则占用2个连接数(向worker请求即可),如果是动态资源则占用4个连接数(需要继续向tomcat请求)
(2)1个master、4个worker,每个worker支持的最大连接数是1024,这种情况下最大的并发数是:
普通的静态资源最大并发数:worker支持的最大连接数(worker数 * 每个worker支持的最大连接数)/2 即:worker_connections * worker_processes/2
http作为反向代理最大并发数:worker支持的最大连接数(worker数 * 每个worker支持的最大连接数)/4即:worker_connections * worker_processes/4(原因:作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两套连接)