• NGINX深入浅出


    专栏收录该内容
    1 篇文章0 订阅
    订阅专栏
    一丶nginx简介
    1.什么是nginx
    Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
    其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
    Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等

    2.反向代理
    1.正向代理

    ​ 在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网的访问

    2.反向代理

    ​ 讲请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴漏的是代理服务器的地址,隐藏了真实服务器的ip

    3.负载均衡
    客户端发送多个请求到服务器,服务器处理请求,有一些与数据库进行交互,服务器处理完毕返回客户端,请求与响应,适合并发较少,成本较低,
    客户端发送请求反向代理服务器,服务器访问服务端,15个请求通过nginx平均分配给多个服务端,
    4.动静分离
    为了加快网站解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力

    把动态资源和静态资源分开来访问,减缓了访问单个服务器的压力

    二丶在linux中docker安装nginx
    1.通过xshell链接虚拟机并打开docker
    2.下载镜像
    docker pull nginx:1.17.8
    1
    3.查看镜像
    docker images
    1
    4.测试镜像
    使用的外部链接端口未9091,80端口留在后面挂载

    sudo docker run --name nginx -p 9091:80 -d nginx:1.17.8 
    docker ps
    http://39.105.82.148:9091
     


    参数含义

    –rm:容器终止运行后,自动删除容器文件。
    –name nginx-test:容器的名字叫做nginx-test,名字自己定义.
    -p: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口
    -d:容器启动后,在后台运行

    5.创建目录
    # 创建www目录
    mkdir -p /server/nginx/html
    # 创建日志目录
    mkdir -p /server/nginx/logs
    # 创建配置目录

    mkdir -p /server/nginx/conf


     
    html: 目录将映射为 nginx 容器配置的虚拟目录。

    logs: 目录将映射为 nginx 容器的日志目录。

    conf: 目录里的配置文件将映射为 nginx 容器的配置文件。

    号外
    windows宿主机访问centOS7虚拟机中的docker服务

    问题描述:在笔记本windows10中,centos7虚拟机运行了docker nginx容器,但是windows10的浏览器无法访问docker中的Nginx服务。

    问题解决:1、虚拟机命令:ifconfig

    查看docker容器的网段、centos的IP地址:

    docker容器的网段为:172.17.0.0 centos虚拟机的IP地址为:192.168.158.10

    管理员身份打windows10的dos窗口,或者运行-CMD

    添加如下路由:C:\windows\system32>ROUTE -p add 172.17.0.0 mask 255.255.0.0 192.168.158.10

    6. nginx 服务部署,映射本地目录到nginx容器
    1.拷贝容器内 Nginx

    默认配置文件到本地当前目录下的 conf 目录,容器ID可以查看 docker ps 命令输入中的第一列

    [root@docker html]# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    ef0dc2b26ab0 nginx "/docker-entrypoint.…" 13 minutes ago Up 13 minutes 0.0.0.0:80->80/tcp nginx-test-web
    93292199bc47 nginx:1.17.8 "nginx -g 'daemon of…" About an hour ago Up About an hour 0.0.0.0:9091->80/tcp nginx
    9a0767c57853 5726af297dd4 "docker-entrypoint.s…" 2 weeks ago Exited (0) 5 days ago rabbitmq3.7.7
    d15046dcce27 redis "docker-entrypoint.s…" 2 weeks ago Exited (0) About an hour ago myredis
    9682287ec60b 5fac85ee2c68 "docker-entrypoint.s…" 2 weeks ago Exited (0) 2 weeks ago niuzi_mysql
    [root@docker html]# docker cp ef0dc2b26ab0:/etc/nginx/nginx.conf /home/nginx/conf/
    
    # nginx的id
    # docker cp ef0dc2b26ab0:/etc/nginx/nginx.conf /home/nginx/conf/
     

    2.挂载命令

    # docker run --rm -d -p 80:80 --name nginx-test-web \
    -v /home/nginx/html:/usr/share/nginx/html \
    -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v /home/nginx/logs:/var/log/nginx \
    --privileged=true \
    nginx


     
    命令说明:

    –rm:容器终止运行后,自动删除容器文件。

    -p 8081:80: 将容器的 80 端口映射到主机的 8082 端口.

    –name nginx-test-web:将容器命名为 nginx-test-web

    -v /home/nginx/www:/usr/share/nginx/html:将我们自己创建的 www 目录挂载到容器的 /usr/share/nginx/html。

    -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:将我们自己创建的 nginx.conf 挂载到容器的 /etc/nginx/nginx.conf。

    -v /home/nginx/logs:/var/log/nginx:将我们自己创建的 logs 挂载到容器的 /var/log/nginx。

    nginx的基本配置需要注意的有以下几点:

    1、几个常见配置项:

    1.$remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址;
    2.$remote_user :用来记录客户端用户名称;
    3.$time_local : 用来记录访问时间与时区;
    4.$request : 用来记录请求的url与http协议;
    5.$status : 用来记录请求状态;成功是200;
    6.$body_bytes_s ent :记录发送给客户端文件主体内容大小;
    7.$http_referer :用来记录从那个页面链接访问过来的;
    8.$http_user_agent :记录客户端浏览器的相关信息;
    2、惊群现象:一个网路连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能。

    3、每个指令必须有分号结束。

    3.编写代码

    完成命令后 进入 /home/nginx/html目录

    vi index.html

    #编辑模式

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Nginx test !!!</title>
    </head>
    <body>
    <h1>还怕大雨吗-</h1>
    <p></p>
    <a href='https://blog.csdn.net/qsy190557020'> 博客入口 </a>
    </body>
    </html>
     


    4.访问

    在浏览器里面输入http://ip:80/,输出结果如下,如果在访问时出现403错误,加权登录

    2.docker安装nginx常用命令

    # 进入容器
    docker exec -it nginx /bin/bash
    # 检查配置文件
    nginx -t
    
    # 重新载入配置文件
    nginx -s reload
    # 重启 Nginx
    nginx -s reopen 
    # 停止 Nginx
    nginx -s stop
     

    3.系统安装nginx常用命令
    首先需要进入 /usr/local/nginx/sbin

    1.查看nginx版本号

    ./nginx-v


     
    2.启动nginx

    ./nginx


     
    3.关闭nginx

    ./nginx -s stop


     
    4.重新加载nginx

    ./nginx -s reload


     
    三丶反向代理
    1.实现效果

    (1).打开浏览器,在浏览器输入地址 www.123.com,跳转到linux的tomcat主页面中

    2.安装并启动tomcat

    (1)安装tomcat。运行,端口号8080

    (2)tar -zxvf tomcat压缩包

    (3)进入bin启动。./startup.sh

    ​ (4) 查看日志 cd logs/ tail -f catalina.out

    (5)通过windows浏览器访问tomcat查看是否能访问

    3.配置host的文件进行配置

    (1) C:\Windows\System32\drivers\etc 的host文件配置

    ​ 虚拟机ip www.aaa.com

    (2) 配置反向代理

    server{
    listen 80;
    charset utf-8;
    server_name 虚拟机ip;
    
    location / {
    proxy_pass http://虚拟机ip:8080;
    proxy_redirect default;
    }
    }
     


    docker配置需要重新挂载

    可直接通过虚拟机ip访问到tomcat

    location正则匹配**

    location [ 空格 | = | ~ | ~* |^|! | !~* ] /uri/ {}

    = 开头:表示精确匹配

    ^~ 开头:注意这不是一个正则表达式,它的目的是优于正则表达式的匹配;如果该 location 是最佳匹配,则不再进行正则表达式检测。

    ~ 开头:表示区分大小写的正则匹配;

    ~* 开头:表示不区分大小写的正则匹配

    !~ && !~*:表示区分大小写不匹配的正则和不区分大小写的不匹配的正则

    四丶负载均衡
    准备2个服务,以tomcat为例

    在nginx配置文件中进行负载均衡配置

    vi nginx.conf

    upstream myserver {
    server ip:端口;
    server ip:端口;
    }
    server {
    server_name ip;
    listen 80;
    location / {
    proxy_pass 路径/myserver
    }
    }
     


    客户端发送请求反向代理服务器,服务器访问服务端,请求通过nginx平均分配给多个服务端,

    负载均衡方式

    1.轮询(默认)

    2.权重/加权(weighted)

    3.随机(random)

    4.哈希(hash)

    5.一致性哈希(consistenthash)

    五丶动静分离
    为了加快网站的解析速度,我们可以把动态页面和静态页面交给不同的服务器来解析,来加快解析速度,提高请求的访问效率,降低原来单个服务器的压力

    Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和

    静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx

    处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,

    一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;

    另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开

    配置如下

    server {
    listen 端口;
    server_name localhost;
    
    #拦截后台请求
    location / {
    proxy_pass http://localhost:8888;
    proxy_set_header X-Real-IP $remote_addr;
    }
    
    #拦截静态资源
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
    root /Users/dalaoyang/Downloads/static;
    }
    
    }
     

    重点是添加 location,

    最后检查 Nginx 配置是否正确即可,然后测试动静分离是否成功,之需要删除后端 tomcat

    服务器上的某个静态文件,查看是否能访问,如果可以访问说明静态资源 nginx 直接返回

    了,不走后端 tomcat 服务器

    配置完成之后重启nginx或重新加载配置

    六丶高可用
    高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是天有不测风云。所以我们只能尽可能的去减少服务的故障。

    在生产环境上很多时候是以Nginx 做反向代理对外提供服务,但是一天Nginx难免遇见故障,如:服务器宕机。当Nginx 宕机那么所有对外提供的接口都将导致无法访问。

    虽然我们无法保证服务器百分之百可用,但是也得想办法避免这种悲剧,目前使用较多的是用keepalived 来实现Nginx的高可用。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BWc95Rjb-1626334140137)(H:\nginx\nginx.assets\1626332113876.png)]

    服务器集群虚拟出来一台 虚拟网关vip(不真实存在,自然不存在宕机问题),

    此vip由两台机器共同协商生成。当有一台机器宕机时,另一台机器一样能维持vip。这保证了,只要两台机器不同时宕机,vip就存在

    详细操作见

    作者 》SimpleWu

    链接 https://www.cnblogs.com/SimpleWu/p/11004902.html

    完结

    ​ 转载请注明作者 https://blog.csdn.net/qsy190557020

    百分之百可用,但是也得想办法避免这种悲剧,目前使用较多的是用keepalived 来实现Nginx的高可用。

    服务器集群虚拟出来一台 虚拟网关vip(不真实存在,自然不存在宕机问题),

    此vip由两台机器共同协商生成。当有一台机器宕机时,另一台机器一样能维持vip。这保证了,只要两台机器不同时宕机,vip就存在

    详细操作见

    作者 》SimpleWu

    链接 https://www.cnblogs.com/SimpleWu/p/11004902.html

    完结

    ​ 转载请注明作者 https://blog.csdn.net/qsy190557020

    ​ 联系作者: 190557020
    ————————————————
    版权声明:本文为CSDN博主「还怕大雨吗-」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qsy190557020/article/details/118760630

    为人:谦逊、激情、博学、审问、慎思、明辨、 笃行
    学问:纸上得来终觉浅,绝知此事要躬行
    为事:工欲善其事,必先利其器。
    态度:道阻且长,行则将至;行而不辍,未来可期
    转载请标注出处!
  • 相关阅读:
    十二月读书笔记2
    11.23
    javascript设计模式之工厂模式
    JavaScript Error:unterminated comment
    文本节点克隆cloneNode知多少
    分治法求第k小元素(vc++)
    dos下利用SMTP、POP3协议发送邮件的过程
    javascript设计模式之单体模式
    js实现无干扰阴影效果,简单好用(附文件下载)
    javascript设置css属性
  • 原文地址:https://www.cnblogs.com/ios9/p/15636928.html
Copyright © 2020-2023  润新知