精华内容
下载资源
问答
  • Nginx服务(二)_零拷贝

    2019-08-12 14:33:11
    目录nginx介绍功能介绍零拷贝nginx的程序架构:nginx模块nginx的功用 nginx介绍 engine X 是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002年开始,第一次...

    nginx介绍

    engine X

    是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002年开始,第一次公开发布时间是2004年10月4日,版本号是0.1.0

    nginx有商业版和社区版,2019年3月11日F5 Networks 6.7亿美元的价格收购
    nginx 是免费,开源,高性能的HTTP和反向代理服务器,邮件代理服务器,通用TCP/UDP代理服务器解决C10K问题(10K Connections)

    官网:http://nginx.org

    nginx的其它的二次发行版:

    Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。从2011年12月开始,Tengine成为一个开源项目
    官网 http://tengine.taobao.org/

    OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台
    官网:http://openresty.org/cn/

    功能介绍

    基本特性:

    1. 模块化设计,较好的扩展性
    2. 高可靠性
    3. 支持热部署:不停机更新配置文件,升级版本,更换日志文件
    4. 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
    5. event-driven,aio,mmap,sendfile

    基本功能:

    1. 静态资源的web服务器
    2. http协议反向代理服务器
    3. pop3/imap4协议反向代理服务器
    4. FastCGI(LNMP),uWSGI(python)等协议
    5. 模块化(非DSO),如zip,SSL模块

    web服务相关的功能:

    1. 虚拟主机(server)
    2. 支持 keep-alive 和管道连接( 共享TCP连接发起并发的HTTP请求)
    3. 支持基于日志缓冲提高其性能
    4. url 重写
    5. 路径别名
    6. 基于IP及用户的访问控制
    7. 支持速率限制及并发数限制
    8. 重新配置和在线升级而无须中断客户的工作进程
    9. Memcached 的 GET 接口

    master-worker模型
    在这里插入图片描述

    主进程(master process)的功能:

    1. 读取Nginx 配置文件并验证其有效性和正确性
    2. 建立、绑定和关闭socket连接
    3. 按照配置生成、管理和结束工作进程
    4. 接受外界指令,比如重启、升级及退出服务器等指令
    5. 不中断服务,实现平滑升级,重启服务并应用新的配置
    6. 开启日志文件,获取文件描述符
    7. 不中断服务,实现平滑升级,升级失败进行回滚处理
    8. 编译和处理perl脚本

    工作进程(woker process)的功能:

    1. 接受处理客户的请求
    2. 将请求以此送入各个功能模块进行处理
    3. IO调用,获取响应数据
    4. 与后端服务器通信,接收后端服务器的处理结果
    5. 缓存数据,访问缓存索引,查询和调用缓存数据
    6. 发送请求结果,响应客户的请求
    7. 接收主程序指令,比如重启、升级和退出等

    零拷贝

    传统的 Linux 系统的标准 I/O 接口(read、write)是基于数据拷贝的,也就是数据都是 copy_to_user 或者 copy_from_user,这样做的好处是,通过中间缓存的机制,减少磁盘 I/O 的操作,但是坏处也很明显,大量数据的拷贝,用户态和内核态的频繁切换,会消耗大量的 CPU 资源,严重影响数据传输的性能,统计表明,在Linux协议栈中,数据包在内核态和用户态之间的拷贝所用的时间甚至占到了数据包整个处理流程时间的57.1%

    什么是零拷贝?
    零拷贝就是上述问题的一个解决方案,通过尽量避免拷贝操作来缓解 CPU 的压力。零拷贝并没有真正做到“0”拷贝,它更多是一种思想,很多的零拷贝技术都是基于这个思想去做的优化

    原始数据拷贝操作
    在这里插入图片描述

    MMAP:Memory Mapping
    在这里插入图片描述

    SENDFILE
    在这里插入图片描述

    DMA 辅助的 SENDFILE
    在这里插入图片描述

    nginx架构
    在这里插入图片描述

    nginx的程序架构:

    master/worker结构

    1. 一个master进程:
      负载加载和分析配置文件、管理worker进程、平滑升级
    2. 一个或多个worker进程
      处理并响应用户请求
    3. 缓存相关的进程:
      cache loader:载入缓存对象
      cache manager:管理缓存对象

    nginx模块

    nginx高度模块化,但其模块早期不支持DSO机制;1.9.11版本支持动态装载和卸载
    提供 错误日志记录 、 配置文件解析 、 事件驱动机制 、进程管理 等核心功能 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、HTTP响应头设置 等等 可选HTTP模块
    主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等 邮件服务模块
    主要用于支持Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等

    模块分类:

    1. 核心模块:core module
    2. 标准模块:
      HTTP 模块: ngx_http_*
        HTTP Core modules 默认功能
        HTTP Optional modules 需编译时指定
      Mail 模块 ngx_mail_*
      Stream 模块 ngx_stream_*
    3. 第三方模块

    nginx模块
    在这里插入图片描述

    核心模块:是 Nginx 服务器正常运行 必不可少 的模块,提供 错误日志记录 、 配置文件解析 、 事件驱动机制 、 进程管理 等核心功能

    标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等

    可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等

    邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持

    第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等

    nginx的功用

    1. 静态的web资源服务器
    2. html,图片,js,css,txt等静态资源
    3. 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
    4. http/https协议的反向代理
    5. imap4/pop3协议的反向代理
    6. tcp/udp协议的请求转发(反向代理)
    展开全文
  • nginx

    万次阅读 多人点赞 2019-02-28 16:39:12
    nginx1. nginx简介2. nginx的特性与优点2.1 nginx的特性2.2 nginx的优点3. nginx反向代理3.1 反向代理的作用3.2 正向代理和反向代理的区别4. nginx的安装与配置4.1 nginx的安装4.2 nginx安装后的配置 1. nginx简介 ...

    1. nginx简介

    nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。

    nginx的特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

    2. nginx的特性与优点

    2.1 nginx的特性

    • Nginx使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接
    • 高度的模块化和自由软件许可证是的第三方模块层出不穷(这是个开源的时代啊~)
    • Nginx是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris, AIX,Mac OS等操作系统上
    • 这些优秀的设计带来的极大的稳定性

    2.2 nginx的优点

    • 高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数
    • 内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)
    • 配置文件非常简单:风格跟程序一样通俗易懂
    • 成本低廉:nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币
    • 支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组
    • 内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问
    • 节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头
    • 稳定性高:用于反向代理,宕机的概率微乎其微
    • 模块化设计:模块可以动态编译
    • 外围支持好:文档全,二次开发和模块较多
    • 支持热部署:可以不停机重载配置文件
    • 支持事件驱动、AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化

    3. nginx反向代理

    多个客户端给服务器发送的请求,Nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。

    客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。

    反向代理,“它代理的是服务端”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。

    3.1 反向代理的作用

    • 保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
    • 负载均衡,通过反向代理服务器来优化网站的负载

    3.2 正向代理和反向代理的区别

    • 在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;
    • 在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;

    4. nginx的安装与配置

    4.1 nginx的安装

    //创建系统用户nginx

    [root@xaii ~]# groupadd -r nginx
    [root@xaii ~]# useradd -r -M -s /sbin/nologin -g nginx nginx
    

    //安装依赖环境

    [root@xaii ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
    暗转过程省略......
    [root@xaii ~]# yum -y groups mark install 'Development Tools'
    安装过程省略......
    

    //创建日志存放目录

    [root@xaii ~]# mkdir -p /var/log/nginx
    [root@xaii ~]# chown -R nginx.nginx /var/log/nginx/
    

    //下载nginx,下载过程省略,存放至/usr/src目录下

    [root@xaii src]# wget http://nginx.org/download/nginx-1.12.0.tar.gz
    [root@xaii ~]# ls /usr/src/ |grep nginx
    nginx-1.12.0.tar.gz
    

    //编译安装nginx

    [root@xaii src]# tar xf nginx-1.12.0.tar.gz 
    [root@xaii src]# cd nginx-1.12.0
    
    [root@xaii nginx-1.12.0]# ./configure \
     --prefix=/usr/local/nginx \
     --user=nginx \
     --group=nginx \
     --with-debug \
     --with-http_ssl_module \
     --with-http_realip_module \
     --with-http_image_filter_module \
     --with-http_gunzip_module \
     --with-http_gzip_static_module \
     --with-http_stub_status_module \
     --http-log-path=/var/log/nginx/access.log \
     --error-log-path=/var/log/nginx/error.log
    //安装过程省略....
    
    [root@xaii nginx-1.12.0]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install
    //-j是指定多少内核
    //过程省略......
    

    4.2 nginx安装后的配置

    //添加环境变量

    [root@xaii ~]# vim /etc/profile.d/nginx.sh
    [root@xaii ~]# cat /etc/profile.d/nginx.sh 
    export PATH=/usr/local/nginx/sbin:$PATH
    [root@xaii ~]# . /etc/profile.d/nginx.sh
    

    //服务控制方式,使用nginx命令

    -t  //检查配置文件语法
    [root@xaii ~]# nginx -t
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    
    
    -v  //输出nginx的版本
    root@xaii ~]# nginx -v
    nginx version: nginx/1.12.0
    
    -c  //指定配置文件的路径
    需要拷贝两个文件:nginx.conf和mime.type至新的路径
    [root@xaii conf]# cp -a nginx.conf /opt/nginx/
    [root@xaii conf]# cp -a mime.types /opt/nginx
    [root@xaii ~]# ps -ef |egrep -v 'grep'|grep nginx
    root       4040      1  0 00:03 ?        00:00:00 nginx: master process nginx -c /optnginx/nginx.conf
    nginx      4041   4040  0 00:03 ?        00:00:00 nginx: worker process
    可以看到,现在用的配置文件为/opt/nginx/nginx.conf
    
    -s  //发送服务控制信号,可选值有{stop|quit|reopen|reload}
    

    //nginx和apache不能同时开启

    //因为apache和nginx的端口都是80,当apache服务开启时,无法开始nginx服务
    
    [root@xaii ~]# ss -antlp|grep 80
    LISTEN     0      128         :::80                      :::*                   users:(("httpd",pid=4081,fd=4),("httpd",pid=4080,fd=4),("httpd",pid=4079,fd=4),("httpd",pid=4078,fd=4),("httpd",pid=4077,fd=4),("httpd",pid=4076,fd=4))
        
    [root@xaii ~]# nginx
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
    ^C
    

    //关闭apache服务,再开启nginx服务

    [root@xaii ~]# apachectl stop
    [root@xaii ~]# nginx
    [root@xaii ~]# ss -antlp|grep 80
    LISTEN     0      128          *:80                       *:*                   users:(("nginx",pid=4069,fd=6),("nginx",pid=4068,fd=6))
    

    4.3利用脚本控制nginx服务的开启,重载,和关闭

    #! /bin/bash
    
    nginx=/usr/local/nginx/sbin/nginx
    conf_path=/opt/nginx/nginx.conf
    
    case $1 in
    start)
            $nginx -c $conf_path
    if [ $? -eq 0 ];then
            echo 'nginx start sucessful'
    else
            echo 'nginx start faild'
    fi
            ;;
    
    
    restart)
            $nginx -s stop
            $nginx -c $conf_path
    if [ $? -eq 0 ];then
            echo 'nginx restart sucessful'
    else
            echo 'nginx restart faild'
    fi
            ;;
    
    
    stop)
            $nginx -s stop 2>/dev/null
    if [ $? -eq 0 ];then
            echo 'nginx is off'
    else
            echo 'nginx error'
    fi
            ;;
    esac
    

    5. nginx的配置文件详解

    主配置文件:/usr/local/nginx/conf/nginx.conf

    • 默认启动nginx时,使用的配置文件是:安装路径/conf/nginx.conf文件
    • 可以在启动nginx时通过-c选项来指定要读取的配置文件

    5.1 nginx.conf配置详解

    nginx.conf的内容分为以下几段:

    • main配置段:全局配置段。其中main配置段中可能包含event配置段
    • event {}:定义event模型工作特性
    • http {}:定义http协议相关的配置

    支持使用变量:

    • 内置变量:模块会提供内建变量定义
    • 自定义变量:set var_name value

    5.2 用于调试、定位问题的配置

    • 参数daemon {on|off}; //是否以守护进程方式运行nginx,调试时应设置为off
    • master_process {on|off}; //是否以master/worker模型来运行nginx,调试时可以设置为off
    • error_log 位置 级别; //配置错误日志

    5.3 正常运行必备的配置参数

    • user USERNAME [GROUPNAME]; //指定运行worker进程的用户和组

    • pid /path/to/pid_file; //指定nginx守护进程的pid文件

    • worker_rlimit_nofile number; //设置所有worker进程最大可以打开的文件数,默认为1024(文件系统最大打开的文件数为65535)

        //此设置为nginx的配置,还需配置系统的文件
        [root@nginx ~]# head -3 /usr/local/nginx/conf/nginx.conf
        user  nginx;(初始为nobody)
        worker_processes  4;(cpu核心数)
        worker_rlimit_nofile 30000;(默认为1024,最大为65535,我们设置为30000)
        [root@nginx ~]# nginx -s reload
      
      
        //修改系统的硬限制和软限制,都设置为最大的65535
        [root@nginx ~]# vim /etc/security/limits.conf 
        [root@nginx ~]# tail -4 /etc/security/limits.conf 
        * soft nofile 65535
        * hard nofile 65535
      
        # End of file
      
    • worker_rlimit_core size; //指明所有worker进程所能够使用的总体的最大核心文件大小,保持默认即可

    5.4 优化性能的配置参数

    • worker_processes n; //启动n个worker进程,这里的n为了避免上下文切换,通常设置为cpu总核心数-1或等于总核心数
    • worker_cpu_affinity cpumask …; //将进程绑定到某cpu中,避免频繁刷新缓存
      • //cpumask:使用8位二进制表示cpu核心,如:
        0000 0001 //第一颗cpu核心
        0000 0010 //第二颗cpu核心
        0000 0100 //第三颗cpu核心
        0000 1000 //第四颗cpu核心
        0001 0000 //第五颗cpu核心
        0010 0000 //第六颗cpu核心
        0100 0000 //第七颗cpu核心
        1000 0000 //第八颗cpu核心
    • timer_resolution interval; //计时器解析度。降低此值,可减少gettimeofday()系统调用的次数
    • worker_priority number; //指明worker进程的nice值

    //具体配置:

    [root@nginx ~]# head /usr/local/nginx/conf/nginx.conf |grep worker_
    worker_processes  4;(cpu核心数为4个)
    worker_rlimit_nofile 30000;
    worker_cpu_affinity 00000001 00000010 00000100 00001000;(所以这里也只能写4个)
    [root@nginx ~]# nginx -s reload
    

    5.5 事件相关的配置:event{}段中的配置参数

    • accept_mutex {off|on}; //master调度用户请求至各worker进程时使用的负载均衡锁;on表示能让多个worker轮流地、序列化地去响应新请求

        [root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf	
        	  events {
            worker_connections  1024;
            accept_mutex on;(添加此内容)
        }
      
    • lock_file file; //accept_mutex用到的互斥锁锁文件路径

        pid        logs/nginx.pid;
        lock_file  logs/nginx.lock;(添加此内容,写在event外部,顶格写)
      
    • use [epoll | rtsig | select | poll]; //指明使用的事件模型,建议让nginx自行选择

    • worker_connections #; //每个进程能够接受的最大连接数

        events {
        worker_connections  1024;
        accept_mutex on;
      

      }

    注意:

    worker_connections(连接数) * worker_processes(cpu核心数) <=30000
    

    5.6 网络连接相关的配置参数

    • keepalive_timeout number; //长连接的超时时长,默认为65s

        keepalive_timeout  65;
      
    • keepalive_requests number; //在一个长连接上所能够允许请求的最大资源数

        keepalive_requests 100;(配置文件中没有设置,默认为100,看自己的业务设置)
      
    • keepalive_disable [msie6|safari|none]; //为指定类型的UserAgeng禁用长连接

    • tcp_nodelay on|off; //是否对长连接使用TCP_NODELAY选项,为了提升用户体验,通常设为on

        tcp_nodelay on;(默认为on)
      
    • client_header_timeout number; //读取http请求报文首部的超时时长

    • client_body_timeout number; //读取http请求报文body部分的超时时长

    • send_timeout number; //发送响应报文的超时时长

    5.7 fastcgi的相关配置参数

    LNMP:php要启用fpm模型
    配置示例如下:

    location ~ \.php$ {
      root html;
      fastcgi_pass 127.0.0.1:9000;      //定义反向代理
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
      include fastcgi_params;
    }
    

    6. 搭建lnmp架构

    6.1 环境:

    nginx端:192.168.157.69
    php、mysql、zabbix端:192.168.157.59

    6.2 php安装

    详情请看:php安装

    6.3 mysql安装

    详情请看:mysql安装

    6.4 php端配置

    //修改配置文件并重启php服务

    [root@xaii ~]# tail -2 /usr/local/php7/etc/php-fpm.conf
    
    listen = 192.168.157.59:9000	(//添加此内容)
    listen.allowed_clients = 192.168.157.69	(//添加此内容)
    
    [root@xaii ~]# service php-fpm restart 
    Gracefully shutting down php-fpm . done
    Starting php-fpm  done
    
    [root@xaii ~]# ss -antl |grep 9000
    LISTEN     0      128    192.168.157.59:9000                     *:*        
    

    6.5 nginx端配置

    //修改配置文件并新加载nginx服务

    location / {
    root   html;
    index  index.php(//添加此内容) index.html index.htm;
        }
    
    
    
     location ~ \.php$ {
     root           /var/www/zabbix;(php端的zabbix目录)
     fastcgi_pass   192.168.157.59:9000; (指向php端ip地址)
     fastcgi_index  index.php;
     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
     include        fastcgi_params;
        }
    
    [root@nginx html]# nginx -s reload
    

    6.6 两端都开启nfs服务,将php端的zabbix目录共享至nginx端

    //php端nfs配置:

    [root@xaii ~]# yum -y install nfs-utils
    [root@xaii ~]# systemctl start nfs
    [root@xaii ~]# echo '/var/www/zabbix *(ro)' > /etc/exports
    [root@xaii ~]# chmod 777 /var/www/zabbix/
    [root@xaii ~]# systemctl restart nfs-server
    

    //nginx端nfs配置,将php端zabbix目录挂载到本地的/usr/local/nginx/html/

    [root@nginx ~]# yum -y install nfs-utils
    [root@nginx ~]# systemctl start nfs
    [root@nginx ~]# mount -t nfs 192.168.157.59:/var/www/zabbix /usr/local/nginx/html(临时挂载)
    [root@nginx ~]# df -Th
    文件系统                                       类型      容量  已用  可用 已用% 挂载点
    /dev/mapper/rhel-root                          xfs        17G  1.5G   16G    9% /
    devtmpfs                                       devtmpfs  901M     0  901M    0% /dev
    tmpfs                                          tmpfs     912M     0  912M    0% /dev/shm
    tmpfs                                          tmpfs     912M  8.6M  904M    1% /run
    tmpfs                                          tmpfs     912M     0  912M    0% /sys/fs/cgroup
    /dev/loop0                                     iso9660   3.8G  3.8G     0  100% /mnt
    /dev/sda1                                      xfs      1014M  143M  872M   15% /boot
    tmpfs                                          tmpfs     183M     0  183M    0% /run/user/0
    192.168.157.59:/usr/local/apache/htdocs/zabbix nfs4       17G  5.9G   12G   35% /usr/local/nginx/html
    [root@nginx ~]# nginx -s reload
    

    6.7 验证

    //输入192.168.157.69

    在这里插入图片描述

    //永久挂载

    [root@nginx ~]# vim /etc/fstab 
    192.168.157.59:/var/www/zabbix /usr/local/nginx/html nfs defaults,_netdev 0 0
    [root@nginx ~]# mount -a 
    [root@nginx ~]# df -Th
    文件系统                       类型      容量  已用  可用 已用% 挂载点
    /dev/mapper/rhel-root          xfs        17G  1.5G   16G    9% /
    devtmpfs                       devtmpfs  901M     0  901M    0% /dev
    tmpfs                          tmpfs     912M     0  912M    0% /dev/shm
    tmpfs                          tmpfs     912M  8.6M  904M    1% /run
    tmpfs                          tmpfs     912M     0  912M    0% /sys/fs/cgroup
    /dev/loop0                     iso9660   3.8G  3.8G     0  100% /mnt
    /dev/sda1                      xfs      1014M  143M  872M   15% /boot
    tmpfs                          tmpfs     183M     0  183M    0% /run/user/0
    192.168.157.59:/var/www/zabbix nfs4       17G  5.8G   12G   34% /usr/local/nginx/html
    

    7. nginx作为web服务器使用的配置:http{}段的配置参数

    http{…}:配置http相关,由ngx_http_core_module模块引入。nginx的HTTP配置主要包括四个区块,结构如下:

    http {//协议级别
      include mime.types;
      default_type application/octet-stream;
      keepalive_timeout 65;
      gzipon;
      upstream {//负载均衡配置
        ...
      }
      server {//服务器级别,每个server类似于httpd中的一个<VirtualHost>
        listen80;
        server_name localhost;
        location / {//请求级别,类似于httpd中的<Location>,用于定义URL与本地文件系统的映射关系
          root html;
          index index.html index.htm;
        }
      }
    }
    

    //http{}段配置指令:
    server {}:定义一个虚拟主机,示例如下:

    server {
      listen 80;
      server_name www.lizhao.com;(自己定义)
      root "/vhosts/web"; (html下网页的路径)
    }
    

    listen:指定监听的地址和端口:

    listen address[:port];
    listen port;
    
    • root path; 设置资源路径映射,用于指明请求的URL所对应的资源所在的文件系统上的起始路径

    • alias path; 用于location配置段,定义路径别名

    • index file; 默认主页面

    • error_page code […] [=code] URI | @name 根据http响应状态码来指明特用的错误页面,例如 error_page 404 /404_customed.html

    • [=code]:以指定的响应码进行响应,而不是默认的原来的响应,默认表示以新资源的响应码为其响应码,例如 error_page 404 =200 /404_customed.html

    location区段,通过指定模式来与客户端请求的URI相匹配:

    //功能:允许根据用户请求的URI来匹配定义的各location,匹配到时,此请求将被相应的location配置块中的配置所处理,例如做访问控制等功能
    

    例如:
    URL:https://www.baidu.com/?tn=sitehao123_15
    URI:www.baidu.com
    ?以前的是协议(https)+URI,?以后的是参数。

    //语法:location [ 修饰符 ] pattern {......}
    
    展开全文
  • center 阿里云linux下nginx配置免费的ssl 场景描述:微信小程序请求的地址需要https的。 1. nginx 安装 http://www.cnblogs.com/taiyonghai/p/6728707.html 2. 在已经安装的nginx上,增加ssl模块 ...

    center 阿里云linux下nginx配置免费的ssl

    场景描述:微信小程序请求的地址需要https的。

    1. nginx 安装

    http://www.cnblogs.com/taiyonghai/p/6728707.html

    2. 在已经安装的nginx上,增加ssl模块

    https://blog.csdn.net/cin_ie/article/details/72843277

    3. 阿里云后台操作

    1. 域名控制台、点击需要需要申请的域名。
    2. 服务器安全策略打开443端口。

    4. nginx 配置ssl

    4.1 将申请过来的文件拷贝到config目录下

    4.2 配置443端口以及域名

    server {
            # listen       80;
             listen       443 ssl;
             server_name  wx.lingximind.com;
    
              ssl_certificate      1765558_wx.lingximind.com.pem;
              ssl_certificate_key  1765558_wx.lingximind.com.key;
    
              ssl_session_cache    shared:SSL:1m;
              ssl_session_timeout  5m;
    
              ssl_ciphers  HIGH:!aNULL:!MD5;
              ssl_prefer_server_ciphers  on;
    
            location / {
                 root html;
                 proxy_pass http://localhost:8080;
                 proxy_set_header Host $host;
                 proxy_set_header X-Real-IP $remote_addr;
                 proxy_set_header X-Forwarded-Proto https;
    	     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	     proxy_redirect off;
                 proxy_connect_timeout      240;
                 proxy_send_timeout         240;
                 proxy_read_timeout         240;
                 client_max_body_size 1000m;
    
            }
    
        }
    

    4.3 输入http直接跳转到https

     server {
            listen       80;
            server_name  wx.lingximind.com;
    		return 301 https://$server_name$request_uri;
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
           # location / {
           #     proxy_pass http://localhost:8080;
           #	    proxy_set_header Host $host;
           #	    proxy_set_header X-Real-IP $remote_addr;
           #	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;            
           # }
        }
    
    展开全文
  • Nginx

    2021-07-24 15:36:31
    一、什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器, Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,...

    一、什么是Nginx

    Nginx (engine x) 是一个高性能的HTTP反向代理web服务器,

    Nginx是一款轻量级Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东新浪网易腾讯淘宝等。

    二、为什么使用Nginx?

    在传统的Web项目中,并发量小,用户使用的少。

    所以在低并发的情况下,用户可以直接访问tomcat服务器,然后tomcat服务器返回消息给用户。

    用户访问<-->Tomcat服务器

    而在互联网项目下,因单个tomcat默认并发量有限制。如果请求量过大,会产生如下问题:

    Tomcat8 默认配置的最大请求数是 150,也就是说同时支持 150 个并发,当然了,也可以将其改大。
    当某个应用拥有 250 个以上并发的时候,应考虑应用服务器的集群。
    具体能承载多少并发,需要看硬件的配置,CPU 越多性能越高,分配给 JVM 的内存越多性能也就越高,但也会加重 GC 的负担。
    操作系统对于进程中的线程数有一定的限制:
    Windows 每个进程中的线程数不允许超过 2000
    Linux 每个进程中的线程数不允许超过 1000
    (在 Java 中每开启一个线程需要耗用 1MB 的 JVM 内存空间用于作为线程栈之用。)
    ​
    Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的。更好的硬件,更多的处理器都会使Tomcat支持更多的并发。
    maxThreads="150" 最大并发数 
    minSpareThreads="10"///初始化时创建的线程数
    maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。

    高并发(High Concurrency)

    是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。

    高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。

    响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。

    吞吐量:单位时间内处理的请求数量。

    QPS:每秒响应请求数。在互联网领域,这个指标和吞吐量区分的没有这么明显。

    并发用户数:同时承载正常使用系统功能的用户数量。

    高可用(High Availability)

    通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。

    (一直都能用 99.9999%)

    高性能

    是指服务响应时间快,(CPU/处理器/内存)特别是在高并发下响应时间不会急剧增加。

    Nginx特点:

    高并发、高性能

    可扩展性好

    高可靠性

    热部署

    BSD许可证

    三、简介

    Nginx (engine x) 是一款轻量级的Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。

    反向代理:

    反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

    正向代理:

    是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

    正向代理和反向代理区别?

    正向代理是在客户端的。比如需要访问某些国外网站,我们可能需要购买vpn。并且vpn是在我们的用户浏览器端设置的(并不是在远端的服务器设置)。浏览器先访问vpn地址,vpn地址转发请求,并最后将请求结果原路返回来。

     

    反向代理是作用在服务器端的,是一个虚拟ip(VIP)。对于用户的一个请求,会转发到多个后端处理器中的一台来处理该具体请求。

     

    四、Nginx下载

    官方网址: http://nginx.org/

     

    ├── conf                                              这是nginx所有配置文件的目录
    │   ├── fastcgi.conf                                      fastcgi 相关参数的配置文件
    │   ├── fastcgi.conf.default                          fastcgi.conf 的原始备份
    │   ├── fastcgi_params                                fastcgi的参数文件
    │   ├── fastcgi_params.default
    │   ├── koi-utf
    │   ├── koi-win
    │   ├── mime.types                                    媒体类型
    │   ├── mime.types.default
    │   ├── nginx.conf                                    nginx默认的主配置文件
    │   ├── nginx.conf.default
    │   ├── scgi_params                                scgi 相关参数文件
    │   ├── scgi_params.default
    │   ├── uwsgi_params                            uwsgi相关参数文件
    │   ├── uwsgi_params.default
    │   └── win-utf
    ​
    ├── fastcgi_temp                                 fastcgi临时数据目录
    ​
    ├── html                                              这是编译安装时nginx的默认站点目录,类似Apache的默认站点htdocs  
    │   ├── 50x.html                                  错误页面优雅替代显示文件,例如:出现502错误时会调用此页面error_page 500 502 503 504 /50x.html
    │   └── index.html                               默认的首页文件,index.html\index.asp\index.jsp来做网站的首页文件
    ​
    ├── logs                                              nginx默认的日志路径,包括错误日志及访问日志
    │   ├── access.log                               nginx的默认访问日志文件,使用tail -f access.log,可以实时观看网站的用户访问情况信息
    │   ├── error.log                                 nginx的错误日志文件,如果nginx出现启动故障可以查看此文件
    │   └── nginx.pid                                nginx的pid文件,nginx进程启动后,会把所有进程的ID号写
    到此文件
    ​
    ├── nginx-1.6.3 -> /application/nginx-1.6.3
    ├── proxy_temp                                临时目录
    ├── sbin                                            这是nginx命令的目录,如nginx的启动命令nginx
    │   ├── nginx                                    Nginx的启动命令nginx
    │   └── nginx.old
    ├── scgi_temp                                 临时目录
    └── uwsgi_temp                              临时目录

    五、Nginx安装与使用

    Windows

    安装

    1、解压文件夹

    2、双击nginx.exe ,一闪而过,nginx启动成功了,通过访问:http://localhost

    (端口号默认80)

    使用

    nginx 的使用比较简单,就是几条命令。

    常用到的命令如下:

    start nginx   启动nginx
    nginx -s stop 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。 
    nginx -s quit 平稳关闭Nginx,保存相关信息,有安排的结束web服务。 
    nginx -s reload 因改变了Nginx相关配置,需要重新加载配置而重载。 
    nginx -s reopen 重新打开日志文件。
    nginx -c filename 为 Nginx 指定一个配置文件,来代替缺省的。 
    nginx -t 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。 
    nginx -v 显示 nginx 的版本。 
    nginx -V 显示 nginx 的版本,编译器版本和配置参数

    windows下 需要带上exe ./nginx.exe -s stop

    提示:

    如果不想每次都敲命令,可以在nginx安装目录下新添一个启动批处理文件startup.bat,双击即可运行。内容如下:

    @echo off 
    rem 如果启动前已经启动nginx并记录下pid文件,会kill指定进程 
    nginx.exe -s stop 
    ​
    rem 测试配置文件语法正确性 
    nginx.exe -t -c conf/nginx.conf 
    ​
    rem 显示版本信息 
    nginx.exe -v 
    ​
    rem 按照指定配置去启动nginx 
    nginx.exe -c conf/nginx.conf

    Linux

    安装Nginx源

    执行以下命令:

    rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

    安装该rpm后,我们就能在/etc/yum.repos.d/ 目录中看到一个名为nginx.repo 的文件。

    安装完Nginx源后,就可以正式安装Nginx了。

    yum install -y nginx

    Nginx默认目录

    输入命令:

    whereis nginx

    即可看到类似于如下的内容:

    nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx

    以下是Nginx的默认路径:

    (1) Nginx配置路径:/etc/nginx/
    (2) PID目录:/var/run/[nginx.pid](https://www.centos.bz/tag/nginx-pid/)
    (3) 错误日志:/var/log/nginx/[error](https://www.centos.bz/tag/error/).log
    (4) 访问日志:/var/log/nginx/access.log
    (5) 默认站点目录:/usr/share/nginx/html

    事实上,只需知道Nginx配置路径,其他路径均可在/etc/nginx/nginx.conf 以及/etc/nginx/conf.d/default.conf 中查询到。

    常用命令

    (1) 启动:

    nginx     // /usr/sbin/nginx

    (2) 测试Nginx配置是否正确:

    nginx -t

    (3) 优雅重启:

    nginx -s reload

    (4) 查看nginx的进程号:

    ps -ef |grep nginx

    (5)nginx服务停止

    nginx -s stop

    kill -9 pid 杀死进程

    Docker安装

    基本安装

    拉取Nginx镜像

    docker pull nginx:latest

    查看本地镜像列表(即可看到nginx)

    docker images

    运行容器

    docker run --name nginx-test -p 80:80 -d nginx

    参数说明:

    • --name nginx-test:容器名称。

    • -p 80:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。

    • -d nginx: 设置容器在在后台一直运行。

    安装成功

     

    高级安装

    为了更方便开发和配置,需要将Docker容器内的信息进行宿主机间的配置

    docker exec -it nginx-test bash 可通过如下命令进入容器内部

    创建目录

    mkdir -p /usr/local/nginx

    依次在该目录下创建三个文件目录

    #创建 www目录
    mkdir -p /usr/local/nginx/html
    ​
    #创建日志目录
    mkdir -p /usr/local/nginx/logs
    ​
    #创建配置文件目录
    mkdir -p /usr/local/nginx/conf

    拷贝配置文件

    docker cp 容器ID:/etc/nginx/nginx.conf  /usr/local/nginx/conf
    docker cp 容器ID:/etc/nginx/conf.d/ /usr/local/nginx/conf

    修改配置文件

    将usr/local/nginx/conf/nginx.conf 内容中的 include 默认路径改为当前路径

     

     

    重新创建/运行容器

    docker run -d -p 80:80 --name nginx-test -v /usr/local/nginx/html:/usr/share/nginx/html -v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/nginx/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v /usr/local/nginx/logs:/var/log/nginx nginx

    测试重新访问

     

    Docker-compose安装

    配置文件描述

    nginx.conf配置文件描述:

    nginx/conf 目录下:

    #运行用户
    user www-data;    
    #启动进程,通常设置成和cpu的数量相等
    worker_processes  1;
    ​
    #全局错误日志及PID文件
    error_log  /var/log/nginx/error.log;
    pid        /var/run/nginx.pid;
    ​
    #工作模式及连接数上限
    events {
        use   epoll;             #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
        worker_connections  1024;#单个后台worker process进程的最大并发链接数
        # multi_accept on; 
    }
    ​
    #设定http服务器,利用它的反向代理功能提供负载均衡支持
    http {
         #设定mime类型,类型由mime.type文件定义
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        #设定日志格式
        access_log    /var/log/nginx/access.log;
    ​
        #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
        #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
        sendfile        on;
        #tcp_nopush     on;
    ​
        #连接超时时间
        #keepalive_timeout  0;
        keepalive_timeout  65;
        tcp_nodelay        on;
        
        #开启gzip压缩
        gzip  on;
        gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    ​
        #设定请求缓冲
        client_header_buffer_size    1k;
        large_client_header_buffers  4 4k;
    ​
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
    ​
        #设定负载均衡的服务器列表
         upstream mysvr {
            #weigth参数表示权值,权值越高被分配到的几率越大
            #本机上的Squid开启3128端口
            server 192.168.8.1:3128 weight=5;
            server 192.168.8.2:80  weight=1;
            server 192.168.8.3:80  weight=6;
        }
    ​
       server {
           #监听80端口
            listen       80;
            #定义使用www.xx.com访问
            server_name  www.xx.com;
    ​
            #设定本虚拟主机的访问日志
            access_log  logs/www.xx.com.access.log  main;
    ​
        #默认请求
        location / {
              root   /root;      #定义服务器的默认网站根目录位置
              index index.php index.html index.htm;   #定义首页索引文件的名称
    ​
              fastcgi_pass  www.xx.com;
             fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name; 
              include /etc/nginx/fastcgi_params;
            }
    ​
        # 定义错误提示页面
        error_page   500 502 503 504 /50x.html;  
            location = /50x.html {
            root   /root;
        }
    ​
        #静态文件,nginx自己处理
        location ~ ^/(images|javascript|js|css|flash|media|static)/ {
            root /var/www/virtual/htdocs;
            #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
            expires 30d;
        }
        #PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
        location ~ \.php$ {
            root /root;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
            include fastcgi_params;
        }
        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status            on;
            access_log              on;
            auth_basic              "NginxStatus";
            auth_basic_user_file  conf/htpasswd;
        }
        #禁止访问 .htxxx 文件
        location ~ /\.ht {
            deny all;
        }
         
         }
    }

    基本配置

    全局块配置:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

    #user  nobody;                  #配置用户或者组,默认为nobody
    worker_processes  1;            #允许生成的进程数,默认为1
    #error_log  logs/error.log;     #制定日志路径,级别。这个设置可以放入全局块,
                #http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    #pid        logs/nginx.pid;    #指定nginx进程运行文件存放地址

    events块配置

    events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为1024(早期是512)

    max_client:

    nginx作为http服务器的时候:

      max_clients = worker_processes * worker_connections
      
        由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。同一时刻nginx在处理客户端发送的http请求应该只是一个connection,由此可知理论上作为http web服务器角色的nginx能够处理的最大连接数就是最大客户端连接数。

    nginx作为反向代理服务器的时候:

      max_clients = worker_processes * worker_connections/4
      
      如果作为反向代理,因为浏览器默认会开启2个连接到server,而且Nginx还会使用fds(file descriptor)从同一个连接池建立连接到upstream后端。则最大连接数的计算公式需要除4

    http块配置

    可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

     #配置nginx支持哪些文件扩展名与文件类型映射表。在conf/mime.types查看支持哪些类型
    include       mime.types;  
    #默认文件类型(流)类型,支持很多文件、图片、js/css等
    default_type  application/octet-stream; 
    ​
    #自定义格式    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; 
    ​
     access_log log/access.log myFormat;  #combined为日志格式的默认值
      #优化参数 允许sendfile方式传输文件,开启高校效传输模式
     sendfile on;  
     #tcp_nopush  on;  #防止网络阻塞
     
       #keepalive_timeout  0;
        keepalive_timeout  65; #长连接超时时间(单位秒)  
       # keepalive_requests 8192; --每个连接最大请求数
       #gzip  on; #开启gzip压缩

    短连接

    连接->传输数据->关闭连接
    比如HTTP是无状态的的短链接,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
    因为连接后接收了数据就断开了,所以每次数据接受处理不会有联系。 这也是HTTP协议无状态的原因之一。

    长连接

    连接->传输数据->保持连接 -> 传输数据-> ...........->直到一方关闭连接,多是客户端关闭连接。
    长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。

    HTTP/1.0默认使用短连接,HTTP/1.1开始默认使用长连接;

    server块配置

    配置虚拟主机的相关参数,一个http中可以有多个server。

    #配置虚拟主机
    server {
            listen       80;  #配置监听端口
            server_name  localhost;  #配置服务器名
    ​
            #charset koi8-r;  #编码格式
    ​
            #access_log  logs/host.access.log  main; //主机的访问日志(如没有,全局为准)
            #默认的匹配/请求,当访问路径中有/,会被该location匹配处理
            location / {
                root   html; #root是配置服务器的默认网站根目录位置,在nginx目录下html
                index  index.html index.htm;
            }
    ​
            #error_page  404              /404.html; #配置404页面
    ​
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html; #配置50x页面
            location = /50x.html {  #精确匹配 
                root   html;
            }
    ​
           
            #禁止(外网)访问 .htaccess文件
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }

    server2块配置

    和上方很类似,主要是配置另一个虚拟机信息

       # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    ​
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}

    server3块配置

    配置https服务

    HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
    ​
    HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。(加密)
    # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
    ​
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    ​
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    ​
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    ​
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}

    HTTP与HTTPS的区别:
      1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
      2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
      3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
      4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
    ​
    HTTPS的优缺点:
    优点:
    1、使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
    2、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
    3、HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
    缺点:
    1、HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;
    2、HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;
    3、SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。
    4、SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。
    5、HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。

    六、应用场景

    需求1: 静态资源

    静态配置文件处理

    由于Nginx性能很高,对于常用的静态资源,可直接交由Nginx进行访问处理

    示例:

    location / {
        root   D:/nginx-tomcat/exam; # /opt/static/exam  /usr/local/nginx/html/exam;
        index  index.html index.htm;  
    }

    Docker示例:

    location / {
        root   /usr/share/nginx/html/exam;  #运行时部署数据卷-v。 外部完成映射。此处需要指定的是Docker内部的目录
        index  index.html index.htm;  
    }

    需求2:反向代理

    让nginx进行转发,即所 谓的反向代理 访问localhost时转到tomcat

    修改nginx.conf文件,查看server 节点,相当于一个代理服务器,可以配置多个。

    listen:表示当前的代理服务器监听的端口,默认的是监听80端口。
    server_name:表示服务名称。
    location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里
    root:里面配置了root这时表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件。
    index:当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找第二个,依此类推
    下面的error_page是代表错误的页面,
     server {
            listen       80;
            server_name  localhost;
            #charset koi8-r;
            #access_log  logs/host.access.log  main;
            location / {
                root   html;
                index  index.html index.htm;
            }
            #error_page  404          

    localhost时转到tomcat时。修改两个地方:

     server_name  exam_xx;
     location / {
            proxy_pass http://127.0.0.1:8080;
      }

    proxy_pass,它表示代理路径,相当于转发,而不像之前说的root必须指定一个文件夹。

    需求3: 动静分离

    我们需要分文件类型来进行过滤,比如jsp直接给tomcat处理,因为nginx并不是servlet 容器,没办法处理JSP,而html,js,css这些不需要处理的,直接给nginx进行缓存即可。

    动态资源:如JSP由Tomcat或其它WEB服务器处理。
    静态资源:如图片、css、js等由nginx服务器完成。
    (动静分离充分利用各自的优势完成高性能访问)

    让JSP页面直接给tomcat,而html,png等一些图片和JS等直接给nginx进行缓存

    location ~ \.jsp$ {  
         proxy_pass http://127.0.0.1:8080;  
    }  
              
    location ~ \.(html)$ {  
         root  /usr/share/nginx/html;  
    }  
    ~ .*\.(html|js|css|images|png|gif|jpg|jpeg|swf|ioc|rar|zip|txt|fiv|mid|doc|ppt|xls|mp3|wma)$
    ~ 表示正则匹配,后面的内容可以是正则表达式匹配
    . 点表示任意字符
    *表示一个或多个字符
    \. 是转移字符
    |表示或
    $表示结尾
    整个配置代表括号晨面的后缀请求都由nginx处理。

    解决方案:

    location ~ \.jsp$ {  
            proxy_pass http://127.0.0.1:8080;  
    }  
              
    location ~ \.(html|js|css|png|gif)$ {  
            root static/maven_exam;   #此处在nginx 目录下创建该文件夹(存储静态资源访问)
    }  

    同时,页面上方要进行 静态资源的变更:(以绝对路径方式进行访问)

    <script type="text/javascript" src="/js/jquery-3.1.1.js"></script>
    <script src="/js/quiz.js"></script>

    结束:nginx对location访问优先是以精确优先为原则,故将精确细的请求放在前面。这样可以完成基本的动静分离配置。

    location ~ \.(html|js|css|png|gif)$ {  
        root D:/static;   #可以是nginx 外部的文件
    }
    location /{  
        proxy_pass http://127.0.0.1:8080;  
    } 

    七、集群

    集群

    同一个业务,部署在多个服务器上

    将一个应用程序,部署到多台服务器上面,然后在这些服务器的前面通过负载均衡服务器来择优选择哪一台服务器去执行;(保证高可用)

    1进入nginx-1.10.1conf路径,修改配置文件nginx.conf

    配置服务器组,在http{}节点之间添加upstream配置。(注意不要写localhost,不然访问速度会很慢)

    upstream nginxCluster{
        server 127.0.0.1:8080;  #服务器8080
        server 127.0.0.1:8081;  #服务器8081
    }

    2在location{}中,利用proxy_pass配置反向代理地址

    此处“http://”不能少,后面的地址要和第一步upstream定义的名称保持一致

    location /{  
            proxy_pass http://nginxCluster;  
    } 

    注意:

    upstream中的server元素必须要注意,不能加http://,但proxy_pass中必须加

    proxy_pass,它表示代理路径,相当于转发,而不像之前说的root必须指定一个文件夹。

    完整如下:

    upstream nginxCluster{
        server 127.0.0.1:8080;  #服务器8080
        server 127.0.0.1:8081;  #服务器8081 .....
     }
     server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location ~ \.(html|js|css|png|gif)$ {  
            root D:/static;   #可以是nginx 外部的文件
        }
        location /{  
            proxy_pass http://nginxCluster;  #集群配置
        } 

    八、Nginx负载均衡策略

    负载均衡是高可用网络基础架构的的一个关键组成部分,有了负载均衡,我们通常可以将我们的应用服务器部署多台,然后通过负载均衡将用户的请求分发到不同的服务器用来提高网站、应用、数据库或其他服务的性能以及可靠性。

    负载均衡:

    将服务器接收到的请求按照规则分发的过程,称为负载均衡

    1、轮询(默认)

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除

    2、指定轮询几率

    weight和访问比率成正比,用于后端服务器性能不均的情况默认选项,当weight不指定时,各服务器weight

    相同, (weight=1)

     

    数字越大,表明请求到的机会越大

    3、ip_hash

    每个请求按访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一服务器进行处理,可以解决session的问题。当后台服务器宕机时,会自动跳转到其它服务器。

     

    基于weight的负载均衡和基于ip_hash的负载均衡可以组合在一起使用

    4、url_hash(第三方)

    url_hash是nginx的第三方模块,nginx本身不支持,需要打补丁

    nginx按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器、文件服务器、静态服务器时比较有效。缺点是当后端服务器宕机的时候,url_hash不会自动跳转的其他缓存服务器,而是返回给用户一个503错误。

    5、fair(第三方)

    按后端服务器的响应时间来分配请求,响应时间短的优先分配

    九、集群/分布式环境下session处理策略

    集群是个物理形态,分布式是个工作方式。

    • 分布式:一个业务分拆多个子业务,部署在不同的服务器上

    • 集群:同一个业务,部署在多个服务器上

    为什么要处理session?

    这个问题想必大多数朋友都知道,在搭建完集群或者分布式环境之后,如果不做任何处理的话,网站将频繁的出现用户未登录的现象。比如:集群中有A、B两台服务器,用户第一次访问网站时,Nginx将用户请求分发到A服务器,这时A服务器给用户创建了一个Session,当用户第二次访问网站时,假设Nginx将用户请求分发到了B服务器上,而这时B服务器并不存在用户的Session,所以就会出现用户未登录的情况,这对用户来说是不可忍受的。
    所以我们在搭建集群/分布式环境之后,必须考虑的一个问题就是用户访问产生的session如何处理,即session的共享机制

    解决方案

    我们将处理Session的方式大致分为三种:

    Session保持(也有人叫黏性Session)、

    Session复制。

    Session共享。

    Session保持(或者叫黏性Session)

    Session保持(会话保持)就是将用户锁定到某一个服务器上。比如上面说的例子,用户第一次请求时,负载均衡器(Nginx)将用户的请求分发到了A服务器上,如果负载均衡器(Nginx)设置了Session保持的话,那么用户以后的每次请求都会分发到A服务器上,相当于把用户和A服务器粘到了一块,这就是Session保持的原理。Session保持方案在所有的负载均衡器都有对应的实现。而且这是在负载均衡这一层就可以解决Session问题。

    优点:非常简单,不需要对session做任何处理。 缺点:1、负责不均衡了:由于使用了Session保持,很显然就无法保证负载的均衡。 缺乏容错性:如果后端某台服务器宕机,那么这台服务器的Session丢失,被分配到这台服务请求的用户还是需要重新登录,所以没有彻底的解决问题。

    实现方式:以Nginx为例,在upstream模块配置ip_hash属性即可实现粘性Session

    容错性,是指软件检测应用程序所运行的软件或硬件中发生的错误并从错误中恢复的能力,通常可以从系统的可靠性、可用性、可测性等几个方面来衡量。

    Session复制

    针对Session保持的容错性缺点,我们可以在所有服务器上都保存一份用户的Session信息。这种将每个服务器中的Session信息复制到其它服务器上的处理办法就称为会话复制。当任何一台服务器上的session发生改变时,该节点会把session的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要session,以此来保证Session同步。

    优点:可容错,各个服务器间的Session能够实时响应。

    缺点:将session广播同步给成员,会对网络负荷造成一定压力

    实现方式:tomcat本身已支持该功能

    tomcat的会话复制分为两种:

    全局复制(DeltaManager):复制会话中的变更信息到集群中的所有其他节点。 非全局复制(BackupManager):它会把Session复制给一个指定的备份节点。

     

    Session共享

    SpringSession+Redis方式实现

     详细:

     spring session项目的redis相关的一个文档:

    https://docs.spring.io/spring-session/docs/2.0.0.BUILD-SNAPSHOT/reference/html5/guides/boot-redis.html

    展开全文
  • 首先去阿里云申请免费证书,然后...在证书控制台下载Nginx版本证书。下载到本地的压缩文件包解压后包含: .crt文件:是证书文件,crt是pem文件的扩展名。 .key文件:证书的私钥文件(申请证书时如果没有选择自...
  • 第三步重启Nginx服务 第四步测试 第五步(附加) Nginx重新编译添加模块 由于博主近期在了解微信小程序,发现网络请求需对,域名配置Https访问: 博主查阅资料找到,腾讯CA证书有一年免费版,在这里...
  • 以下包括以下部分: 一、阿里云免费购买SSL证书 ...3、在SSL证书中,下载cert证书,然后放到nginx服务器上 二、nginx无缝升级https 4、查看nginx是否支持ssl 5、配置ssl模块 6、重新编译一下 7、因为这次...
  • Nginx 概述

    2021-06-15 21:33:05
    Nginx 介绍 Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus )2019年3月11日 F5 Networks 6.7亿美元的价格收购 Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP...
  • 在证书控制台下载Nginx版本证书。...1. 在Nginx的安装目录下创建cert目录,并且将下载的全部文件拷贝到cert目录中。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为a.ke...
  • 1.进入阿里云官网,搜索ssl 2.支付完成以后,进入ssl控制台,填写资料,进行审核,这里我...6.在Nginx安装目录(Nginx默认安装目录为/usr/local/nginx/conf)执行以下命令创建cert目录。 cd /usr/local/ngin.
  • nginx入门

    2021-06-06 12:54:31
    Nginx 概述 Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7*24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。 性能是 ...
  • Nginx服务器配置

    2019-06-19 11:31:41
    Nginx服务器可以作为静态页面访问的服务器. nginx做为服务器可以实现虚拟主机、反向代理、负载均衡。 nginx优点: 1,支持高并发访问 2,内存消耗少 3,配置简单 4,成本低,开源免费 5,稳定性高 6,支持热部署 7,...
  • 全面了解 Nginx

    2021-05-27 00:25:29
    作者:Lionhttps://juejin.cn/post/6942607113118023710Nginx 概述Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热...
  • nginx安装

    2020-12-06 16:16:19
    nginx
  • 登录您的Nginx服务器,在Nginx安装目录(默认Nginx安装目录为/usr/local/nginx/conf)下创建cert目录,并将下载的证书文件和密钥文件拷贝到cert目录中。 重启 systemctl restart nginx.service 配置cdn 如果没开通...
  • Nginx入门

    2021-04-15 01:02:46
    Nginx的安装与介绍 Nginx简介 ​Nginx(engine x)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。 ​因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名,其特点是占有...
  • nginx笔记

    2019-08-28 18:00:56
    nginx笔记1. 什么是集群2. 什么是分布式3. 什么是负载均衡器, 以及作用:3.1 负载均衡器的分类:3.2 nginx反向代理配置:3.3 nginx负载均衡配置:4. 负载均衡工作原理5. 准备环境 (搭建Nginx)5.1 关闭防火墙5.2 nginx...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,244
精华内容 2,897
关键字:

nginx免拷贝