一、Nginx简介
1. 什么是Nginx
Nginx (“engine x”)是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好
Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50000个并发连接数。
2、反向代理
a. 正向代理
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
b. 反向代理
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
3、负载均衡
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
4、动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
基本特征
Nginx基本特征有:
(1)处理静态文件,索引文件以及自动索引,打开文件描述符缓冲。
(2)无缓存的反向代理加速,简单的负载均衡和容错。
(3)模块化的结构,包括gzipping,byte ranges,chunked responses以及SSI-filter等filter,如果由FastCGI或其它代理服务器处理蛋液中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待。
(4)支持SSL和TLSSNI。
二、Nginx 安装
1 | #执行第一条语句即可 |
编译安装nginx
1 | 1.下载源码包 |
docker安装nginx
1 | docker search nginx |
将nginx容器内部配置文件挂载到主机
1.在主机/mnt目录
下执行 mkdir -p ./nginx/{conf,html,logs}
创建挂载目录
2.将容器内的nginx.conf
与default.conf
文件分别拷贝到主机/mnt/nginx
和/mnt/nginx/conf
下,分别执行
1 | docker cp ef:/etc/nginx/nginx.conf ./ |
cp 命令代表复制, ef是我们nginx容器的ID,/etc/nginx/nginx.conf 是容器内部 nginx.conf 路径
此时我们的目录结构是这样的,这就是我们等会儿要与nginx容器挂载的目录
此时我们的目录结构是这样的,这就是我们等会儿要与nginx容器挂载的目录
1 | [root@un1queyan nginx]# ll |
3.执行docker stop b3
命令停止刚刚创建的nginx容器,b3是容器Id,然后执行docker rm b3
移除容器,
4.执行docker run -d --name mynginx -p 80:80 -v /mnt/nginx/nginx.conf:/etc/nginx/nginx.conf -v /mnt/nginx/logs:/var/log/nginx -v /mnt/nginx/html:/usr/share/nginx/html -v /mnt/nginx/conf:/etc/nginx/conf.d --privileged=true nginx
命令,重新创建nginx容器
1 | [root@un1queyan conf]# docker run -d --name mynginx -p 80:80 -v /mnt/nginx/nginx.conf:/etc/nginx/nginx.conf -v /mnt/nginx/logs:/var/log/nginx -v /mnt/nginx/html:/usr/share/nginx/html -v /mnt/nginx/conf:/etc/nginx/conf.d --privileged=true nginx |
这时我们在容器的挂载 /mnt/nginx/html
目录下创建index.html
,内容随便写上hello docker nginx,再次访问主机IP
1 | echo hello > index.html |
nginx软件目录
- conf 存放nginx所有配置文件的目录,主要nginx.conf
- html 存放nginx默认站点的目录,如index.html、error.html等
- logs 存放nginx默认日志的目录,如error.log access.log
- sbin 存放nginx主命令的目录,sbin/nginx
Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的。一般,每个区块以一对大括号{}来表示开始与结束1
2
3
4
5
6
CoreModule核心模块
user www; #Nginx进程所使用的用户
worker_processes 1; #Nginx运行的work进程数量(建议与CPU数量一致或auto)
error_log /log/nginx/error.log #Nginx错误日志存放路径
pid /var/run/nginx.pid #Nginx服务运行后产生的pid进程号
events事件模块
1 |
|
http内核模块
1 |
|
部署nginx站点
nginx默认站点是Nginx目录下的html文件夹,这里可以从nginx.conf中查到
1 | location /{ |
如果要部署网站业务数据,只需要把开发好的程序全放到html目录下即可
1 | [root@un1queyan /tmp 11:34:52]#ls /opt/nginx1-12/html/ |
因此只需要通过域名/资源,即可访问
Nginx多个虚拟主机
如果每台linux服务器只运行了一个小网站,那么人气低,流量小的草根站长需要承担高额的服务器租赁费,也造成了硬件资源浪费。
虚拟主机就是将一台服务器分割成多个“虚拟服务器”,每个站点使用各自的硬盘空间,由于省资源,省钱,众多网站都使用虚拟主机来部署网站。
1 | 虚拟主机的概念就是在web服务里的一个独立的网站站点,这个站点对应独立的域名(IP),具有独立的程序和资源目录,可以独立的对外提供服务。 |
虚拟主机类型
1 | 基于域名的虚拟主机 |
nginx可以自动识别用户请求的域名,根据不同的域名请求服务器传输不同的内容,只需要保证服务器上有一个可用的ip地址,配置好dns解析服务。
/etc/hosts是linux系统中本地dns解析的配置文件,同样可以达到域名访问效果
- 修改nginx.conf在浏览器上访问localhost:80
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34egrep -v '#|^$' /opt/nginx1-12/conf/nginx.conf
#配置文件内容如下
worker_processes 1;
events {
worker_connections 1024;
}
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"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
#虚拟主机1
server {
listen 80;
server_name www.pyyuc.cn;
location /{
root html/pyyuc;
index index.html index.htm;
}
}
#虚拟主机2
server {
listen 80;
server_name www.pythonav.cn;
location /{
root html/pythonav;
index index.html index.htm;
}
}
}Nginx访问日志功能
日志功能对每个用户访问网站的日志信息记录到指定的日志文件里,开发运维人员可以分析用户的浏览器行为,此功能由ngx_http_log_module模块负责,官网地址是:
http://nginx.org/en/docs/http/ngx_http_log_module.html
控制日志的参数对应参数解析1
2log_format 记录日志的格式,可定义多种格式
accsss_log 指定日志文件的路径以及格式日志效果如下1
2
3
4
5
6
7
8
9$remote_addr 记录客户端ip
$remote_user 远程用户,没有就是 “-”
$time_local 对应[14/Aug/2018:18:46:52 +0800]
$request 对应请求信息"GET /favicon.ico HTTP/1.1"
$status 状态码
$body_bytes_sent 571字节 请求体的大小
$http_referer 对应“-” 由于是直接输入浏览器就是 -
$http_user_agent 客户端身份信息
$http_x_forwarded_for 记录客户端的来源真实ip 97.64.34.118Nginx404页面优化
我们可以将404,403等页面的错误信息重定向到网站首页或者其他指定的页面,提升用户访问体验。1
2
3
4
5
6
7
8
9
10server {
listen 80;
server_name www.pythonav.cn;
root html/pythonav;
location /{
index index.html index.htm;
}
#在pythonav路径下的40x.html错误页面
error_page 400 403 404 405 /40x.html;
}Nginx反向代理功能
nginx实现负载均衡的组件ngx_http_proxy_module proxy代理模块,用于把请求抛给服务器节点或者upstream服务器池
机器准备,两台服务器反向代理配置文件nginx.conf1
2master 192.168.11.63 主负载
slave 192.168.11.64 web1
1 | worker_processes 1; |
此时访问master的服务器192.168.11.63:80地址,已经会将请求转发给slave的80端口
除了页面效果的展示以外,还可以通过log(access.log)查看代理效果
nginx负载均衡
1 | Web服务器,直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台WEB服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到我们的后端服务器集群中, |
Nginx要实现负载均衡需要用到proxy_pass代理模块配置
Nginx负载均衡与Nginx代理不同地方在于
Nginx代理仅代理一台服务器,而Nginx负载均衡则是将客户端请求代理转发至一组upstream虚拟服务池
Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用。
upstream配置
在nginx.conf > http 区域中
1 | upstream django { |
在nginx.conf > http 区域 > server区域 > location配置中
添加proxy_pass
1 | location / { |
此时初步负载均衡已经完成,upstream默认按照轮训方式负载,每个请求按时间顺序逐一分配到后端节点
upstream分配策略
1 | 调度算法 概述 |
1.轮询(不做配置,默认轮询)
2.weight权重(优先级)
3.ip_hash配置,根据客户端ip哈希分配,不能和weight一起用weight 权重
1 | upstream django { |
ip_hash
1 | 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器 |
backup
在非backup机器繁忙或者宕机时,请求backup机器,因此机器默认压力最小
1 | upstream django { |
Nginx实验负载均衡
1 | 角色 ip 主机名 |
关闭防火墙
1 | iptables -F |
一、web01服务器配置nginx,创建index.html
1 | server { |
二、web01服务器配置nginx,创建index.html
1 | server { |
三、配置lb01服务器的nginx负载均衡
1.检查lb01的 nginx.conf
1 | http { |
2.手动创建proxy_params文件,文件中存放代理的请求头相关参数
1 | [root@lb01 conf]# cat /opt/nginx/conf/proxy_params |
1 | 启动lb01负载均衡nginx服务 |
四、访问lb01节点nginx,反复刷新
五、nginx动静分离
环境准备
1 | 系统 服务 软件 ip地址 |
一、在web01机器上,配置静态资源,图片等
1 | cat nginx.conf |
二、在web02配置动态请求,准备一个flask程序和静态资源转发
1 | cat nginx.conf |
准备flask应用,flask.py
1 | from flask import Flask |
python flask-web.py &