Nginx

⼀、课程概况
1、 课程定位
项⽬定位:
前端⻚⾯展示、动静访问分离
2、 课程⼤纲
第 1 章 快速⼊⻔
1.1 基础知识
1.2 配置详解
第 2 章 进阶知识
2.1 反向代理
2.2 负载均衡
2.3 ⽇志解析
3、 学习环境
操作系统:Ubuntu
⽹络模式:NAT
资源配置:1C2G|4G
⼆、快速⼊⻔
学习⽬标
了解 Nginx的特点和⻆⾊
应⽤ Nginx环境部署
了解 Nginx配置结构
了解 Nginx访问原理
学习内容
Nginx简介
Nginx部署
1、Nginx简介
1.1、介绍特点
描述
⾼并发量
基于 epoll/kqueue 模型开发,⽀持⾼并发量,官⽅说其⽀持⾼达 5w 并发连接数
的响应
内存消耗少
善于处理静态⽂件,相较于其他web(⽐如:apache),占⽤更少的内存及资源
简单稳定
配置简单(⼀个conf⽂件),运⾏简单(nginx命令),⽽且运⾏稳定
模块化程度
功能模块插件化设计,可以⾃由配置相应的功能
低成本
Nginx的负载均衡功能很强⼤⽽且免费开源,相较于⼏⼗万的硬件负载均衡器成本
相当低
特点
描述
动态处理
nginx善于处理静态⽂件,但是处理动态⻚⾯相较于Apache之类重量级的web软件
能⼒稍⽋缺
Nginx(发⾳同 engine x)是⼀款基于异步框架的轻量级/⾼性能的Web 服务器/反向代理服务器/缓存服务
器/电⼦邮件(IMAP/POP3)代理服务器,并在⼀个BSD-like 协议下发⾏。由俄罗斯的程序设计师Igor
Sysoev(伊⼽尔·赛索耶夫)所开发,最初供俄国⼤型⽹站Rambler.ru及搜寻引擎Rambler使⽤。
1.2、特点
优点
缺点
项⽬定位
静态⽂件展示、动静分离
2、Nginx部署
2.1、软件安装
命令⾏安装: apt install nginx -y
检查nginx运⾏端⼝: netstat -tnulp | grep nginx
nginx服务操作指令(使⽤ systemctl 指令操作):
nginx服务操作指令(使⽤ nginx 可执⾏程序操作):
# start:启动;stop:关闭;reload:重启
systemctl [start|stop|reload] nginx⽬录
描述
⼯作⽬
/etc/nginx
执⾏⽂
/usr/sbin/nginx
⽇志⽬
/var/log/nginx
web⽬
/var/www/html/,⾸⻚⽂件是index.nginx-debian.html /usr/share/nginx/html/ ⾸⻚
⽂件是index.html
⽂件⽬录
描述
默认⽂件
/etc/nginx/nginx.conf
其他⽬录
/etc/nginx/{sites-available/sites-enabled/conf.d}
配置段
描述信息
全局配置段
nginx的基础配置属性
http配置段
nginx的web服务基础配置属性
server配置段
项⽬或者应⽤配置属性
location配置段
url配置属性
2.2、默认配置简介
nginx软件默认⽬录
nginx默认配置⽂件
⽂件结构
nginx -V|v # 查看版本
nginx -c /etc/nginx/nginx.conf
nginx -s [stop|reload] # [关闭|重启]
nginx -t2.3、访问原理
3、配置详解
学习⽬标
应⽤ server配置段⽇常属性
应⽤ location配置段⽇常属性
学习内容
Server属性
Location属性
进阶实践
3.1、Server配置
3.1.1、配置样式
server配置段最重要的属性是listen和server_name。它们都是⽤于匹配并处理请求的
3.1.2、属性详解
listen属性
server {
listen 端⼝;
server_name 主机名;
...
}形式
描述
示例
完整示例
IP:Port
地址精确表示样式
listen 10.10.10.10:99
listen 10.10.10.10:99
IP
⾃动监听 IP:80地址
listen 10.10.10.10
listen 10.10.10.10:80
Port
⾃动监听 全地址:Port
listen 99或 [::]:99
listen 0.0.0.0:99
default_server
⾃动使⽤默认的地址
listen default_server
listen localhost:80
作⽤:定义Server监听的ip和port,当ip/port匹配时候才进⾏下⼀步匹配。
server_name属性
作⽤:当A主机只有⼀个开发的端⼝80,但是却存在多个⽹站,我们可以通过Server_name指定
的域名,进⾏匹配后的下⼀步操作
root属性
作⽤:定义Server相应请求的html⽂件所在路径
index属性
作⽤:定义响应请求后返回的⽂件名称或格式
3.2、Location配置
3.2.1、配置样式
location主要是根据Server匹配到的请求路径和关键字去响应和处理。
语法:
其中:
optional_modifier是匹配条件
location_match是匹配的样式
{}是要执⾏的操作
匹配条件主要有两种:正则/前缀字符。
server_name www.example.com;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
location optional_modifier location_match { ... }类型
含义
匹配⽅式
优先级
样式
~ 或 !~
普通正则-敏感 或 不敏感
正则符号
3
location ~ .(jpe?g)$ {}
~ 或 !~
普通正则-不敏感 或 敏感
正则符号
3
location ~* .(jpe?g)$ {}
类型
含义
匹配⽅式
优先级
样式
=/路径
精确匹配
前缀
1
location = /image {}
^~
优先匹配
前缀
2
location ^~ /page {}
@
内部重定向
前缀
location @name {}
空 /
通⽤匹配
前缀
4
location / {}
3.2.2、匹配规则
正则匹配
普通匹配
匹配示例
常⻅示例:
访问效果如下:
访问根⽬录/, ⽐如http://a.com/ 将匹配规则A
访问 http://a.com/login 将匹配规则B
访问 http://a.com/static/a.html 将匹配规则C
访问 http://a.com/a.gif, http://a.com/b.png 规则D和E均适合,按顺序优先使⽤规则D
访问 http://a.com/static/c.png 则优先匹配到规则C
访问 http://a.com/a.PNG 则匹配规则E,因为规则E不区分⼤⼩写。
访问 http://a.com/a.XHTML 使⽤规则F。
location = / { location ~ .(gif|jpg|png|js|css)$ { location !~* .xhtml$
{
#精确规则A #正则规则D #正则规则G
} } }
location = /login { location ~* .png$ { location / {
#精确规则B #正则规则E #通⽤规则H
} } }
location ^~ /static/ { location !~ .xhtml$ {
#优先规则C #正则规则F
} }访问 http://a.com/category/id/1111 则最终匹配到规则H。
3.2.3、简单实践
在location内部常⽤的功能属性⾮常多,常⻅的基本属性、访问控制、⽬录列表等。
3.3、进阶实践
3.3.1、应⽤⽬录
root 和 alias 所起的作⽤都是指定响应请求所⽤⽂件的路径,只是他们有些许的区别。
root 表示 location 匹配内容的相对路径
alias 表示 ⼀个绝对路径,⽽且必须以"/"结尾
效果⼀:访问http://localhost/img/,nginx找/var/www/image/⽬录下的⽂件
效果⼆:访问http://localhost/img/,nginx找/var/www/image/img/⽬录下的⽂件
注意:
⼀般情况下,在location /中配置root,在location /other中配置alias
配置的⽬录必须有nginx的访问权限,否则全部失效,不要设置为X⽤户的家⽬录。
3.3.2、项⽬整合
1、准备⼯作
我们这⾥以 192.168.203.151 主机作为美多商城的部署主机,我们已经准备好了代码⽬录
/data/servers/
其中:
/data/servers/front_end_pc/ ⽬录是商城⻚⾯静态⽂件根⽬录
/data/servers/meiduo_mall_admin/ ⽬录是管理后台静态⽂件根⽬录
/data/servers/meiduo_mall/ ⽬录是Django动态服务器根⽬录
location / {
root /var/www/html; # 指定响应请求的⽂件所在路径
index index.php index.html index.htm; # 指定响应请求的默认⽂件名称
try_files $uri $uri/ =404; # 如果root指定的路径下有查找的⽂件,就
返回,否则报错
}
效果⼀: 效果⼆:
location /img/ { location /img/ {
alias /var/www/image/; root /var/www/image;
} }(1)、修改美多商城⼯程配置
(2)、编译⽣成美多商城管理站点静态⽂件
进⼊管理站点前端⼯程⽬录: cd meiduo_mall_admin
安装依赖包(如果安装过则⽆需重复安装): npm install
编译⽣成静态⽂件(静态⽂件存储在 meiduo_mall_admin/dist
meiduo_mall_admin/dist ⽂件夹中): npm run build
(3)、上传静态⽂件和美多商城的代码到部署主机指定⽬录
front_end_pc ⽂件夹⾥⾯的所有⽂件发送到部署主机 /data/servers/front_end_pc ⽬录
下: scp -r front_end_pc/* <部署主机⽤户名>@<部署主机
ip>:/data/servers/front_end_pc/
meiduo_mall_admin/dist/ ⽂件夹⾥⾯的所有⽂件发送到部署主
机 /data/servers/meiduo_mall_admin ⽬录下: scp -r meiduo_mall_admin/dist/* <部署
主机⽤户名>@<部署主机ip>:/data/servers/meiduo_mall_admin/
(4)、清空nginx⽆效配置(可做可不做)
rm /etc/nginx/conf.d/*
rm /etc/nginx/sites-enabled/*
rm /etc/nginx/sites-available/*
2、美多商城静态nginx配置⽂件
新建 /etc/nginx/conf.d/8080.conf 并编辑如下:
server {
listen 8080;
server_name www.meiduo.site;
location / {
root /data/servers/front_end_pc/;
index index.html;
try_files $uri $uri/ =404;
}
}
新建 /etc/nginx/conf.d/8081.conf 并编辑如下:
server {
listen 8081;
server_name www.meiduo.site;
location / {
root /data/servers/meiduo_mall_admin/;
index index.html;
try_files $uri $uri/ =404;
}
}3、启动服务
(1)、检查nginx配置⽂件
nginx -t
(2)、启动nginx
systemctl restart nginx
三、进阶知识
2.1 反向代理
了解 反向代理的特点
应⽤ 反向代理实践
2.2 负载均衡
了解 负载均衡分类及其特点
应⽤ 负载模块实践
了解 常⻅负载均衡算法
应⽤ 基本负载操作流程
2.3 ⽇志解析
了解 ⽇志基本结构及其应⽤流程
了解 ⽇志常⻅变量属性
应⽤ ⽇志的应⽤流程
1、反向代理
1.1、基础知识
1.1.1、 代理简介
代理是什么?
简单来说,我找⼀个中间⼈,代替我去做⼀件事情,只要他给我结果就可以。
在nginx中,我们⼀般⽤的就是 "反向代理"
反向代理1.2、代理模块
官⽅介绍
官⽅资料:http://www.nginx.cn/doc/standard/httpproxy.html
官⽅的代理属性很多,我们主要介绍proxy_pass
官⽅代码示例
属性详解:
proxy_pass 指 令设置被代理服务器的地址和被映射的URI,地址可以使⽤主机名或IP加端⼝号的
形式
proxy_pass关键点
proxy_pass后⾯的路径最后的/作⽤很重要!!!
示例代码:
假设我们访问的url是 http://domain.com/html/test.js,如何理解上述两种proxy_pass的区别呢?
对于 1 来说 proxy.com后⾯没有"/",表示"/html/" 请求(包括⾃⼰)后续的路径及其参数等关键字
都由http://a.com/来处理,代理后的样式如下: http://proxy.com/html/test.js
对于 2 来所 proxy.com后⾯有"/",表示"/html/" 请求后续的路径及其参数等关键字都由http://a.c
om/来处理,代理后的样式如下: http://proxy.com/test.js
uwsgi模块
功能简介
location / {
proxy_pass http://localhost:8000; # 设定请求跳转后的地址,可以使⽤hostname或IP:Port
}
location /html/ {
proxy_pass http://proxy.com;
proxy_pass http://proxy.com/;
}动态请求
响应
浏览器
代理服务器8000
Django动态服务器
nginx善于做静态⽂件相关的代理,⽽不擅⻓动态相关的代理,所以nginx的uwsgi模块就出现了,它主
要做动态相关的代理⼯作
代码示例:
1.2、代理实践
我们将 192.168.203.151 主机作为了美多商城的代码部署主机。
(1)、新建 /etc/nginx/conf.d/8000.conf 编辑如下
(2)、检查nginx配置⽂件并重启
nginx -t
systemctl restart nginx
2、负载均衡
2.1、基础知识
2.1.1、功能简介
负载均衡是什么?
我们之前使⽤proxy_pass的⽅式实现了nginx代理请求到后端的效果,随着我们的⽹站访问量越来越
多,⼀个后端就不现实了,那么接下来我们应该如果在访问量⽇渐增⼤的情况下,满⾜线上业务的稳定
呢?
include uwsgi_params;
uwsgi_pass uwsgi_server_address;
server {
listen 8000;
location / {
proxy_pass http://127.0.0.1:8001;
 
# 使⽤nginx的uwsgi接⼝对接django(需要使⽤uwsgi运⾏django并使⽤socket模式)
# include uwsgi_params;
# uwsgi_pass 127.0.0.1:8001;
}
}类型
描述
⾬露均沾型
轮训、加权轮训、哈希
定向服务型
ip_hash、least_conn、cookie、route、lean、
商业类型
ntlm、least_time、queue、stick
解决⽅法就是:负载均衡
负载均衡简单说来⼈多⼒量⼤,打群架。
2.1.2、模块简介
官⽅介绍
官⽅资料:http://www.nginx.cn/doc/standard/httpupstream.html
官⽅的负载属性很多,我们主要介绍upstream和ip_hash属性
官⽅代码示例
属性详解:
upstream 主要是定义⼀个后端服务地址的集合列表,每个后端服务使⽤⼀个server命令表示
upstream {} 和 Server {} 两部分内容属于平级关系。
2.2、调度策略
官⽅资料:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#example
Nginx提供的负载均衡策略有两种:内置策略 和 扩展策略
内置策略:nginx⾃带的算法
常⽤算法简介:
upstream backend {
server backend2.example.com:8080;
}
server {
location / {
proxy_pass http://backend;
}
}轮询(默认):请求按顺序逐⼀分配到不同的后端服务器。
weight:指定轮询权重,值越⼤,分配到的⼏率就越⾼,适⽤于后端服务器性能不均衡情况。
ip_hash:按访问IP的哈希结果分配请求,分配后访客访问固定后端服务器,有效的解决动态⽹⻚会话共享
问题。
fair:基于后端服务器的响应时间来分配请求,响应时间短的优先分配。
url_hash:按访问URL的哈希结果分配请求,使同URL定
轮训
加权轮训
upstream meiduo_backend {
server 192.168.8.14:10086 weight=20;
server 192.168.8.14:10087 weight=80;
}
server {
listen 80;
location / {
proxy_pass http://meiduo_backend/;
}
}
ip哈希
upstream meiduo_backend {
ip_hash;
server 127.0.0.1:10086;
server 127.0.0.1:10087;
}
server {
listen 80;
location / {
proxy_pass http://meiduo_backend/;
}
}
url哈希2.3、美多负载均衡部署
新建/修改 /etc/nginx/conf.d/8000.conf
重启nginx
nginx -t systemctl restart nginx
把 uwsgi.ini 配置⽂件中设置 socket=127.0.0.1:8001 模式;
upstream meiduo_backend {
hash $request_uri;
server 127.0.0.1:10086;
server 127.0.0.1:10087;
}
server {
listen 80;
location / {
proxy_pass http://meiduo_backend/;
}
}
upstream backend.meiduo.site {
server 127.0.0.1:8001;
# server 127.0.0.1:8002;
}
server {
listen 8000;
location / {
include uwsgi_params;
uwsgi_pass backend.meiduo.site;
}
}
[uwsgi]
# 使⽤Nginx连接时使⽤,Django程序所在服务器地址
socket=127.0.0.1:8001
# 直接做web服务器使⽤,Django程序所在服务器地址
# http=127.0.0.1:8001
# 项⽬⽬录
# chdir=项⽬路径/meiduo_project/meiduo_mall
chdir=/data/servers/meiduo_mall
# 项⽬中wsgi.py⽂件的⽬录,相对于项⽬⽬录
wsgi-file=meiduo_mall/wsgi.py
# 进程数
processes=4
# 线程数
threads=2
# uwsgi服务器的⻆⾊使⽤ uwsgi 运⾏django
uwsgi --ini uwsgi.ini
3、⽇志解析
3.1、⽇志简介
Nginx默认提供了两个⽇志⽂件 access.log和error.log,通过access.log可以得到⽤户请求的相关信息;
通过error.log可以获取某个web服务故障或其性能瓶颈等信息。
⽽且nginx的⽇志⽀持定制化格式,这样我们就可以根据实际的业务情况更好的⾼效⼯作。最常⻅的场
景就是获取客户端的IP,记录⽤户访问量。
官⽅介绍:http://nginx.org/en/docs/http/ngx_http_log_module.html
3.2、基本配置
注意: nginx⽇志属性设置的完整格式是:
属性名称 access_log
存储位置 /var/log/nginx/access.log
⽇志格式 位置为空表示使⽤默认的combined ⽇志格式。它是通过log_format设置的
3.3、默认⽇志格式
注意:log_format是有⼀批nginx内置变量组合⽽成的。
⽇志样式:
master=True
# 存放进程编号的⽂件
pidfile=uwsgi.pid
# ⽇志⽂件
daemonize=uwsgi.log
# 指定依赖的虚拟环境
# virtualenv=/Users/meihao/.virtualenvs/project
virtualenv=/home/weiwei/.virtualenvs/django_env
# cat /etc/nginx/nginx.conf -n
40 access_log /var/log/nginx/access.log;
41 error_log /var/log/nginx/error.log;
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';变量名
描述
$remote_addr
前⼀台主机的ip地址,不⼀定是真实的客户端IP
$remote_user
⽤于记录远程客户端的⽤户名称(⼀般为“-”)
$time_local
⽤于记录访问时间和时区
$request
⽤于记录请求的url以及请求⽅法
$status
响应状态码,例如:200成功、404⻚⾯找不到等。
$body_bytes_sent
给客户端发送的⽂件主体内容字节数
$http_referer
可以记录⽤户是从哪个链接访问过来的
$http_user_agent
⽤户所使⽤的代理(⼀般为浏览器)
变量名
描述
$uri
不带请求参数的当前URI,不包含主机名
$http_x_forwarded_for
可以记录客户端IP,通过代理服务器来记录客户端的ip地址
$http_x_real_ip
可以记录客户端IP,通过代理服务器来记录客户端的ip地址
浏览器
⼀级代理10086
⼆级代理10087
web服务器
3.4、内置变量
nginx常⽤的内置变量主要是⽤来分析⽇志中的http记录的,我们可以根据内置的变量精确的获取相关
的信息 默认变量
其他常⽤变量
3.5、⾃定义⽇志记录代理ip
需求:
基于代理⽅式访问app1应⽤,⽇志存放在/var/logs/nginx/app1/access.log,要求能从⽇志中获取客户
端的IP地址;
定制⽇志
设置⽇志格式
# tail /var/log/nginx/access.log
192.168.8.14 - - [12/Nov/2018:08:24:18 -0800] "GET /favicon.ico HTTP/1.0" 404 580 "-"
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/55.0.2883.87 Safari/537.36"~# vim /etc/nginx/nginx.conf
##
# Logging Settings
##
log_format proxy_format '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_forwarded_for" "$http_x_real_ip"';
注意:这个格式,仅仅需要在真正的web应⽤server上设置。
使⽤⽇志格式:
access_log /var/log/nginx/access.log proxy_format;
代理配置⽂件
# ⼀级代理
server {
listen 10086;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:10087;
}
}
# ⼆级代理
server {
listen 10087;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:10088;
}
}
# web服务器
server {
listen 10088;
location / {
root
原文地址:https://www.cnblogs.com/zhangwei112/p/13588920.html