目录
Nginx简介
- Nginx是一个高性能的HTTP和反向代理web服务器
- 特点是占有内存少,并发能力强
- Nginx专为性能优化而开发,能经受高负载的考验,有报告表明能支持高达50000个并发连接数
Nginx的Docker安装
- 拉取镜像:$ docker pull nginx:latest
- 查看本地镜像,看nginx是否安装成功弄 $ docker images
- 运行nginx 容器 :$ docker run --name nginx-test -p 8080:80 -d nginx
- --name nginx-test:容器名称。
- -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
- -d nginx: 设置容器在在后台一直运行。
- 通过 ifconfig查看linux的ip
- 然后进行访问
Nginx的配置
- Nginx配置文件由三部分组成
- 全局块:从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令。主要包括配置运行Nginx服务器的用户(组)、允许生成的worker process数、进程PID存放路径、日志存放路径和类型以及配置文件的引入等。
-
worker_processes = 1 // 这是Nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理量也就越多,但是会受到硬件、软件设备的制约
- events块:涉及的指令主要影响Nginx服务器与用户的网络连接。
-
events { worker_connections 1024 // nginx服务器支持的最大连接数 }
- http块:Nginx服务器中配置最频繁的部分。Http全局块指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。server块和虚拟主机有关系,又包括全局server块和location块
[root@bogon conf]# cat /usr/local/webserver/nginx/conf/nginx.conf
user www www;
worker_processes 2; #设置值和CPU核心数一致
error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; #日志位置和日志级别
pid /usr/local/webserver/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
http
{
include 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';
#charset gb2312;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m;
#下面是server虚拟主机的配置
server
{
listen 80;#监听端口
server_name localhost;#域名
index index.html index.htm index.php;
root /usr/local/webserver/nginx/html;#站点目录
location ~ .*\.(php|php5)?$
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$
{
expires 30d;
# access_log off;
}
location ~ .*\.(js|css)?$
{
expires 15d;
# access_log off;
}
access_log off;
}
}
Nginx反向代理
通过Nginx访问tomcat
需要在Nginx的conf下面的nginx.conf文件中配置
通过Nginx跳转到微服务的不同服务,这里用两个tomcat代替微服务一个8080,一个8081
nginx的配置为
必要时需要在linux中配置对外开放端口号
查看想开的端口是否已开:firewall-cmd --query-port=6379/tcp
添加指定需要开放的端口:firewall-cmd --add-port=123/tcp --permanent
Nginx的负载均衡
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
两个toncat的目录下放入同一个页面,通过Nginx访问该页面,会交替的访问到tomcat8080和tomcat8081
Nginx配置
Nginx提供的几种分配方式:
- 轮询(默认):每个请求按时间顺序分配到后端服务器,如果down掉,自动剔除,就是轮流访问服务器
- weight:weight代表权重,默认为1,权重越高分配的越多
- ip_hash:每个请求按照ip的hash分配,这样每个访客固定访问后端一个服务器,解决了session的问题,加在第一红块server上一行,也就是客户端第一次访问的服务器是那个,以后该客户端一直访问该服务器。
- fair(第三方):按后端服务器响应的时间来分配,响应时间短的优先分配。加在第一红块server最后一行。就是看那个服务器响应快
Nginx的动静分离
- Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名﹐放在独立的服务器上,也是目前主流推崇的方案处理静态页面。另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。其中静态请求存在2个连接,动态请求存在4个连接。
- 通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
- 1在Linux系统中准备一些静态资源:www中放一个html页面,image中放个图片
- 2nginx的配置
输入http://192.168.200.128/image/01.jpg,因为配置了autoindex on,所以会列出来目录
输入http://192.168.200.128/www/a.html:
Nginx的高可用配置
我们需要有这么两台Nginx服务器,keepAlive,虚拟ip地址
- 两台服务器192.168.200.128、192.168.200.129
- 两台服务器上都安装nginx
- 两台服务器上的usr文件夹下都安装keepalived:yum install keepalived -y ,安装完成后,在etc里面生成目录keepalived,有文件keepalived.conf
- 高可用配置(主从配置)
- 修改etc/keepalived/keepalived.conf
配置nginx主机的keepalived.conf:
! Configuration File for keepalived
#此处为全局定义
global_defs {
#默认不修改
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
#修改此处的ip地址
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL # 主机名字
}
#检测脚本以及权重的参数(是否还活着)
vrrp_script chk_http_port {
#脚本配置文件的路径,需要配置脚本
script "/usr/local/src/nginx_check.sh" //此处为配置脚本的位置
interval 2 #(检测脚本执行的间隔)每隔两秒检测一次
weight 2 # 权重
}
#虚拟ip配置 包括状态 网卡 优先权 以及虚拟ip地址
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface eth33 # 网卡名字,可通过ifconfig查询网卡名字
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #检测是否还活着
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.77.50 # VRRP H 虚拟地址
}
}
配置nginx备用机的keepalived.conf
! Configuration File for 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.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh" //此处为配置脚本的位置
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.77.50 # VRRP H 虚拟地址 主从机需要配置的一样
}
}
nginx主从机中keepalived中keepalived.conf文件中的脚本配置
#!/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
Nginx的原理
- 两个进程(一个master多个worker)
- 利于nginx -s reload热部署,即有个重启后,其他还可以进行
- 每个worker独立占有进程,方便操作不用加锁
- nginx与redis都是采用io多路复用机制,所以worker数和cpu数相等最合适
- worker连接数,发送一个请求,连接数可能是2/4(静态是client和worker,动态还需要一个tomcat)
- 支持最大并发数:动态worker_connections * worker_processes/4 ,静态worker_connections * worker_processes /2。即work个数*每台work连接发送数