• 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
  • 相关阅读:
    DataTable 只保留想要的几列
    如何用多个字符串来切分字符串
    用.net 发送邮件
    sqlserver 行列转换
    sql面试题一 学生成绩
    将DataReader转换为DataTable
    C# 如何用多个字符串来切分字符串并去除空格
    SqlServer按时间自动生成生成单据编号
    实验一 Java开发环境的熟悉
    Java学习笔记心得——初识Java
  • 原文地址:https://www.cnblogs.com/zhangwei112/p/13588920.html
Copyright © 2020-2023  润新知