Nginx

Nginx应用场景

  • 静态资源服务器
  • 反向代理服务
  • API接口服务(Lua&Javascript)


    1.jpg

Nginx的优势

  • 高可靠性
  • 高并发高性能
  • 可扩展性好
  • 开源许可证
  • 热部署,平滑升级

下载新版本nginx直接覆盖即可,内部会把之前nginx后缀改掉,例如:nginx->nginx.od继续提供服务;直到nginx之前服务提供完毕才干掉老的nginx

Nginx的架构

  • 轻量
    • 源代码只包含核心模块
    • 其他非核心功能都是通过模块实现,可以自由选择
  • 架构

Nginx采用的是多进程(单线程)和多路IO复用模型;一般一个进程最少有一个线城,但是为什么说Nginx多进程(单线程)呢?因为Nginx是有多个进程,每个进程有一个线城。

  • 工作流程
  1. Nginx在启动后,会有一个master进程和多个互相独立的worker进程
  2. master进程接收来自外界的信号,向各worker进程发送信息,每个进程都有可能来处理这个连接
  3. master进程能监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动启动新的worker进程
  4. worker进程数,一般会设置成机器CPU核数。因为更多的worker数,只会导致进程相互竞争CPU,从而带来不必要的上下文切换
  5. 使用多进程模式,不仅能提高并发,而且进程之间相互独立,一个worker进程挂了不会影响其他worker进程
2.jpg
  • IO多路复用

多个文件描述符的IO操作都能在一个线程里并发交替顺序完成,复用线程


3.jpg
  • CPU亲和

把CPU内核和Nginx的工作进程绑定在一起,让每个worker进程固定在一个CPU上执行,从而减少CPU的切换并提供缓存命中率,提高性能

  • sendfile
  1. 简单说:正常的读取文件是内核接收请求,然后把请求转给用户空间的应用程序,应用程序再去通知内核,内核读取完毕之后返给应用程序,应用程序返给内核通过网卡响应请求
  2. sendfile零拷贝传输模式,是Nginx动静分离的原理;原理是这样的,请求到来,Nginx直接通知内核读取读取之后直接返回,全过程只在内核空间,而且可以有缓存,不经过用户空间和内核空间的拷贝来拷贝去,所以性能很高
4.jpg

附录

  1. 用户空间和内核空间
  • 现在操作系统都采用虚拟寻址,处理器先产生一个虚拟地址,通过地址翻译成物理地址(内存的地址),再通过总线的传递,最后处理器拿到某个物理地址返回的字节。
  • 对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。
  • 针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。
  • 地址空间就是一个非负整数地址的有序集合。如{0,1,2...}
  1. 进程上下文切换(进程切换)
  • 为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换(也叫调度)。因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。
  • 从一个进程的运行转到另一个进程上运行,这个过程中经过下面这些变化:
    • 保存当前进程A的上下文。上下文就是内核再次唤醒当前进程时所需要的状态,由一些对象(程序计数器、状态寄存器、用户栈等各种内核数据结构)的值组成;这些值包括描绘地址空间的页表、包含进程相关信息的进程表、文件表等
    • 切换页全局目录以安装一个新的地址空间
    • 恢复进程B的上下文;恢复进程B的上下文
  1. 文件描述符
  • 文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。
  • 文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。

I-O 模型如何演进及 I-O 多路复用是什么?

什么是IO

I/O 是 Input/Ouput的缩写,即输入输出端口,是信息处理系统(例如计算机)与外部世界(可能是人类或另一信息处理系统)之间的通信。输入是系统接收的信号或数据,输出则是从其发送的信号或数据。

I/O 先修知识

I/O 也是一个很宽泛的词,每个设备都会有一个专用的 I/O 地址,用来处理自己的输入输出信息。对于服务端研发的童鞋相信 网络 I/O、磁盘 I/O 这些词,也需并不陌生,一次 API 接口调用、向磁盘写入日志信息,其实就是在跟 I/O打交道。一次 I/O操作分为等待资源、使用资源两个阶段,以下分别进行介绍。

阻塞与非阻塞 I/O

阻塞与非阻塞 I/O是对于操作系统内核而言的,发生在等待资源阶段,根据发起 I/O 请求是否阻塞来判断。

阻塞 I/O:这种模式下一个用户进程在发起一个 I/O 操作之后,只有收到响应或者超时才可进行处理其它事情,否则 I/O 将会一直阻塞。以读取磁盘上的一段文件为例,系统内核在完成磁盘寻道、读取数据、复制数据到内存中之后,这个调用才算完成。阻塞的这段时间对 CPU 资源是浪费的。

非阻塞 I/O:这种模式下一个用户进程发起一个 I/O 操作之后,如果数据没有就绪,会立刻返回(标志数据资源不可用),此时 CPU 时间片可以用来做一些其它事情。

同步与异步 I/O

同步与异步 I/O 发生在使用资源阶段,根据实际 I/O 操作来判断。

同步 I/O:应用发送或接收数据后,如果不返回,继续等待(此处发生阻塞),直到数据成功或失败返回。

异步 I/O:应用发送或接收数据后立刻返回,数据写入 OS 缓存,由 OS 完成数据发送或接收,并返回成功或失败的信息给应用。Node.js 就是典型的异步编程例子。

用户空间与内核空间

操作系统为了支持多个应用同时运行,需要保证不同进程间相对独立、内核的安全,那就不能谁都能来操作了,因此操作系统将内存空间划分为用户空间、内核空间两部分。用户空间存放用户程序代码和数据,而内核空间存放内核代码和数据。

其实一直以来对于用户空间与内核空间的界限划分还是有点傻傻分不清的感觉,最近读到了一篇文章 解读I/O多路复用技术 https://www.jianshu.com/p/db5da880154a,上面有段描述,分别从 OSI 七层模型图 和 网际网协议族 来看待用户空间与内核空间的分界线,此处引用下图片,总结性的说明下,更详细的推荐去作者网站看下原文讲解。

OSI 七层模型与网际网协议族图

可以看到这里以传输层做了边界划分,传输层之上为用户空间(Web 客户端、浏览器、FTP 这些都属于上三层),下四层为内核空间,例如传输层的 TCP、UDP 协议就对应到了内核空间。


1.png

操作系统 I/O 模型演进

操作系统的 I/O 模型分为:阻塞 I/O、非阻塞 I/O、I/O 复用、信号驱动 I/O、异步 I/O 五种,本节参考 Unix 网络编程一书,图片也引自本书中,以下分别进行介绍。

同步阻塞 IO

从应用程序开始系统调用->数据就绪进行拷贝->拷贝结束,这之间应用程序都处于等待状态,不能做其它事情,直到将数据拷贝到用户空间或出错才返回,我们称之为阻塞 I/O 模式。

2.png

同步非阻塞 IO

相比于同步阻塞 I/O 模式,同步非阻塞 I/O 在每次调用之后,如果数据没有就绪就会立即返回,之后重复调用来检查 I/O 操作是否就绪,这对 CPU 资源是一个极其浪费的操作,直到数据就绪将数据从内核拷贝到用户空间,返回成功指示给到应用程序。

Read:就是一种实现,通过重复轮询 I/O 来判断。


3.png

IO 多路复用

链接(Socket)并发大的情况,上面两种就不适合了,前面一个处理不完,后面就只能干等,这里就用到了 I/O 多路复用技术,下图所示相比较前两种,分为了两步,先进行 select 数据就绪后,在调用 recvfrom 进行真正的 I/O 读写操作。它的高级之处还在于能够一个线程同时处理多个 Socket。

4.png

什么是 I/O 多路复用?

【面试指南】请解释下什么是 I/O 多路复用?

有必要先弄清这个概念,这里的 I/O 通常指网络 I/O,多路指多个 Socket 链接,复用指操作系统进行运算调度的最小单位线程。整体意思也就是多个网络 I/O 复用一个或少量的线程来处理 Socket。关于 I/O 多路复用的多种实现,继续参考下文。

I/O 多路复用的四种实现

I/O 多路服用有多种实现模式:select、 poll、 epoll、 kqueue

  • select

通过轮询检查在文件描述符上设置的标识位来进行判断,select 的轮询相当于在数据库中查找一条记录没有建立索引,对所有的 socket 进行全部遍历,这对 CPU 是浪费的。另外 select 还有一个限制,对于单个进程所能打开的文件描述符最大只能是 1024,那么基于 select 的轮询技术最多也只能很好的处理 1000 并发的吞吐量,可以查看 上一个10年,著名的C10K并发连接问题

  • poll

poll 和 select 在实现上没有本质的区别,相比较 select,poll 基于链表来实现,没有了最大链接 1024 的限制。但是当文件描述符多了之后,每次调用都会对链接进行线性遍历,性能还是十分低下的。

  • epoll

是 linux 下效率最高的 I/O 事件通知机制,没有最大链接限制,通过 callbak 回调通知机制,不在是每次调用都对链接进行线性遍历,这样就不会随着文件描述符的增加导致效率下降。

在 1GB 内存的机器上能监听大约 10 万个端口,远超过 select 的 1024 限制,具体可以在服务器上查看 cat/proc/sys/fs/file-max

  • kqueue

与 epoll 类似,仅存于 FreeBSD(一种类UNIX操作系统)。

信号驱动 IO

仅在 Unix 上支持,与 I/O 多路复用相比避免了 select 的阻塞轮询。应用程序进行系统调用后立即返回,处理其它事物,在数据就绪之后系统会发送一个 SIGIO 信号到应用程序,应用进程开始读取数据。


5.png

异步 IO 模型

异步 I/O 模型是目前最理想的一种形式,应用程序发起系统调用后无需等待直接返回当前调用状态,进行后续的其它任务,结果由内核完成 I/O 操作之后通过回调通知到我们的应用程序,中间没有阻塞过程。

在 Linux2.6 之后增加了异步 I/O 的实现方式 AIO,但是很少系统能够实现。


6.png

白话风格讲解 I/O 模型的演进

上面讲解了几种 I/O 模型的演进,如果不明白的,我们通过白话风格(小明与妹子的邂逅)讲解操作系统 I/O 模型是什么?之间的区别是什么?

故事标题:小明与妹子的邂逅

故事情节:小明在校园一次文艺晚会上邂逅了一位妹子,在只得知妹子名字、手机号的情况下,经过几天的苦苦追寻,历经千山万水,终得美人归!
演员介绍:男一号@小明、女一号@妹子、串场@门卫大爷

  • 同步阻塞 I/O 模式

小明电话相约妹子在校门口,然后小明很专一、不见到妹子不回家,期间没有做任何事情,一直在等待!

  • 同步非阻塞 I/O 模式

小明电话相约妹子在校门口,妹子还没准备好(出门前化妆几小时。。。),这时候的小明很执着,每隔一会儿给妹子发个信息直到妹子准备好了。

  • I/O 多路复用模式

select 小明电话相约妹子在校门口,委托门卫select大爷帮忙,select大爷很敬业每出去一个人都会进行询问,但是select大爷有个限制最多只能询问1024个。

poll poll类似于select功能,不同的是poll大爷没有1024限制,可以一直坚持,但是当poll大爷超过1024,询问的越来越多之后就显得越来越精疲力尽了。

epoll 小明电话相约妹子在校门口,委托门卫epoll大爷帮忙,epoll大爷不在是每个询问,规定每个人出入校门必须带上学生证,这样opoll大爷就是知道哪个是小明的女神了,epoll大爷找到女神之后在电话通知小明。

  • 信号驱动 I/O 模式

小明电话相约妹子在校门口,此时妹子回复说我还没准备好(出门前化妆几小时。。。),这个时候小明也没去,而是先去干其它事情了,等妹子准备好之后电话通知小明,我已经准备好了,小明这个时候才去校门口等着和妹子的约会。

  • 异步 I/O 模式

小明告诉妹子我们在校园门口相约,之后小明没有在那干等了,而是先回宿舍休息会或者和朋友在打会球等等,妹子到校门口之后电话通知小明,我已经来啦。

  • select 采用了线性遍历来查找,链接多了之后可以想象一下在一个诺大的数组中每次通过遍历来锁定一个链接,是多么的消耗性能。

  • epoll 则不需要遍历,采用的是回调机制,可以看作一个 HashTable,来锁定一个对象是很快的。

文件描述符限制

  • 对于文件描述符(最大连接数)select 限制为 1024。
  • epoll 则没有这个限制,通常在 1G 内存的机器上所能支持的连接数为 10W 左右。

对于操作系统的支持

从操作系统支持上来看,目前流行的高性能 Web 服务器 Nginx 是基于 epoll来实现高并发,当然如果你的链接很小的情况下区别还是不大的 select也能满足,如果是大流量、高并发情况 epoll 目前还是首选模型。

安装

  • Ubuntu安装
  1. sudo apt-get install nginx -y
  2. sudo service nginx start 检验nginx是否安装成功
apt安装nginx最新版-因为直接sudo apt-get update然后安装可能还是比较老版本的nginx

查看版本: nginx -v


sudo apt-get install software-properties-common
sudo add-apt-repository ppa:nginx/stable 
sudo apt-get update
sudo apt-get install nginx -y
  • Centos安装
1. 安装 nginx 源
* sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm 
2. 查看 Nginx 源是否配置成功
* 通过 yum search nginx 看看是否已经添加源成功。如果成功则执行下列命令安装 Nginx。
或者 npm info nginx 也可以看看 nginx 源是否添加成功
3. 安装 Nginx
* sudo yum install -y nginx 3、启动 Nginx 并设置开机自动运行
* sudo systemctl start nginx
* sudo systemctl enable nginx 
核心配置文件 /etc/nginx/nginx.conf
程序文件 /usr/sbin/nginx
日志目录 /var/log/nginx
缓存目录 /var/cache/nginx
启动脚本 /etc/init.d/
虚拟主机的目录 /var/www/nginx-default
执行文件目录 /usr/sbin/nginx(说明了这就是启动命令真实调用的地方)

cgi配置

  • CGI是common gateway interface(通用网关接口)
  • Web Server是通过CGI协议可以把动态的请求传递给如PHP,jsp,python等应用程序
  • FastCGI实际上是增加了一些扩展供能的CGI,是CGI的改进,描述了客户端和Web服务器程序之间传输数据的一种标准
  • SCGI协议是一个CGI协议的替代品,它是一个应用与HTTP服务器的接口标准,类似于FastCGI,但是设计更容易实现
  • uwsgi是一个web服务器,它实现了WSGI协议,uwsgi、http等协议
5.jpg

CGI程序的工作原理

Web服务器一般只用来处理静态文件请求,一旦碰到动态脚本请求,Web服务器主进程就会Fork创建出一个新的进程来启动CGI程序,也就是将动态脚本交给CGI程序来处理。启动CGI程序需要一个过程,如读取配置文件、加载扩展等。当CGI程序启动后会去解析动态脚本,然后将结果返回给Web服务器,最后由Web服务器将结果返回给客户端,之前Fork出来的进程也随之关闭。这样,每次用户请求动态脚本,Web服务器都要重新Fork创建一个新进程去启动CGI程序,由CGI程序来处理动态脚本,处理完成后进程随之关闭,其效率是非常低下的。

FastCGI

FastCGI是Web服务器与处理程序之间通信的一种协议,是CGI的改进版本。由于CGI程序反复加载CGI而造成性能低下,如果CGI程序保持在内存中并接收FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail-Over特性等。

FastCGI就是常驻型的CGI,可以一直运行。在请求到达时不会耗费时间去Fork创建一个进程来处理。FastCGI是语言无关的、可伸缩架构的CGI开放扩展,它将CGI解释器进程保持在内存中,因此获得较高的性能。

FastCGI的工作流程

  • Web服务器启动时载入FastCGI进程管理,如IIS的ISAPI、Apache的Module...
  • FastCGI进程管理器自身初始化,并启动多个CGI解释器进程php-cgi并等待Web服务器的连接。
  • 当客户端请求到达Web服务器时,FastCGI进程管理器选择并连接一个CGI解释器,Web服务器将CGI环境变量和标准输入发送到FastCGI子进程PHP-CGI。
  • FastCGI子进程完成处理后将标准输出和错误信息,从同一连接返回给Web服务器。当FastCGI子进程关闭连接时请求便处理完毕。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web服务器中)的下一个连接。在CGI模式中,PHP-CGI在此便退出了。
路径 用途
/etc/nginx/fastcgi_params fastcgi配置
/etc/nginx/scgi_params scgi配置
/etc/nginx/uwsgi_params uwsgi配置

编码转换映射转化文件

  • 这三个文件都是与编码转换映射文件,用于在输出内容到客户端时,将一种编码转换到另一种编码
  • koi8-r是斯拉夫文字8位元编码,供俄语以及保加利亚语使用。在Unicode未流行之前, koi8-r是最为广泛使用的俄语编码,这三个文件存在的原因是作者是俄国人。
路径 用途
/etc/nginx/koi-utf koi8-r<-->utf-8
/etc/nginx/koi-win koi8-r<-->windows-1251
/etc/nginx/win-utf windows-1251<-->utf-8

扩展名文件

/etc/nginx/mime.types;设置http协议的Content-Type与扩展名对应关系

配置文件

  • /etc/nginx/nginx.conf # 主配置文件
  • /etc/nginx/conf.d/* # 包含conf.d目录下的所有配置文件
  • /etc/nginx/conf.d/deafult.conf
# 设置运行此nginx的用户名
user www-data;
# 工作进程数
worker_processes auto;
pid /run/nginx.pid;# 这是一个文件,里面放当前nginx的进程号
include /etc/nginx/modules-enabled/*.conf;

events {
        # 工作进程的最大连接数
        worker_connections 768;
        # multi_accept on;
}

# 使用#添加注释,使用$符号可以使用变量
# 配置文件由指令和指令块组成,指令块以{}将多条指令组织在一起
http {
        ##
        # Basic Settings
        ##

        sendfile on; # 零拷贝模式
        tcp_nopush on;# TCP有一定的缓存,避免来了就推,提高性能,攒起来一起给;上下文 :http server location
        tcp_nodelay on;# 在keepalive连接下,提高网络包的传输实时性(立刻发),和tcp_nopush刚好相反;上下文 :http server location
        keepalive_timeout 65;# 活动链接超时时间
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        # include语句允许把多个配置文件组合起来以提升可维护性
        include /etc/nginx/mime.types;
        # 每条指令以;结尾,指令与参数之间以空格分隔

        # 默认的Content-Type,前提是上面mime.types里面找不到的情况下
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        # 指定访问日志的存放位置,格式为main
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;# 是否启用压缩;上下文 :http server location

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6; # 压缩比率越高,文件被压缩的体积越小
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1; #压缩版本 1.0/1.1 ;上下文 :http server location
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

一个被引入的配置文件

server{
    listen 80;
    server_name localhost;
    location /{
        root /usr/share/nginx/html;
        index index.html index htm;
    }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html{
        root /usr/share/nginx/html;
    }
    location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
        # pass PHP scripts to FastCGI server
        # 如果.php结尾得请求,直接通过fastcgi-php处理
        #location ~ \.php$ {
        #       include snippets/fastcgi-php.conf;
        #
        #       # With php-fpm (or other unix sockets):
        #       fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        # 如果路径包含/.ht ,则禁止所有人访问
        #location ~ /\.ht {
        #       deny all;
        #}
    }
}
tail -f /var/log/nginx/access.log
可以监听看到该文件的变化

内置变量

名称 含义
$remote_addr 客户端地址
$remote_user 客户端用户名称
$time_local 访问时间和时区
$request 请求行
$status HTTP请求状态
$body_bytes_sent 发送给客户端文件内容大小

HTTP请求变量

名称 含义 例子
arg_PARAMETER 请求参数 $arg_name
http_HEADER 请求头 http_host http_x_forwarded_for(代理过程)
sent_http_HEADER 响应头 send_http_cookie

IP1->IP2(代理)->IP3 会记录IP地址得代理过程

  • http_x_forwarded_for=Client IP,Proxy(1) IP,Proxy(2) IP

  • 示例

# 定义一种日志格式
log_format zqft '$arg_name  $http_referer sent_http_date';
# 指定写入得文件名和日志格式
access_log /var/log/nginx/access.log zqft;

监控Nginx状态

/etc/nginx/conf.d/default.conf

# 添加节点在server内部加一个路径 /status(名字随意)

server{
    location /status{
        stub_status on;
    }
}

然后重载nginx -s reload;之后网络请求/statuc路径即可;返回如下

Active  connections:2
server accepts handled requests
    21   21  34
Reading: 0 Writing: 1 Waiting:1
参数 含义
Active connections 当前nginx正在处理得活动连接数
accepts 总共处理得连接数
handled 成功创建得握手数
requests 总共处理请求数
Reading 读取到客户端得Header信息数
Writing 返回给客户端得Header信息数
Waiting 开启keep-alive得情况下,这个值等于active-(reading+writing)

随机主页

location / {
    root  /data/html;#静态文件根目录
    random_index  on;# 这样就会随机返回/data/html目录下得html文件
}

字符串替换

location / {
    root  /data/html;
    index index.html index.htm
    sub_filter 'world' 'zq';#例如返回得静态文件,中world被替换成zq,但是只会替换一个
    sub_filter_once off;# 全部替换,而不是只替换第一个
}

请求限制

  • 模块名
    • --with-limit_conn_module 连接频率限制
    • --with-limit_req_module 请求频率限制
    • 一次TCP请求至少产生一个HTTP请求
    • SYN>SYN,ACK->ACK->REQUEST->RESPONSE->FIN->ACK->FIN->ACK
  • ab
    • Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx、lighthttp、IIS等其他web服务器的压力
      • -n 总共的请求数
      • -c 并发的请求数

ab -n 40 -c 20 http://127.0.0.1

  • 语法
    • limit_req_zone
# 可以以IP为key_zone为空间的名称 size为申请空间的大小
Syntax: limit_req_zone key zone=name:size rate=rate;
Defult: --
Context: http(定义在server之外)
- limit_req
# zone名称 number限制的数量
Syntax: limit_req key zone=name [burst=number] [nodelay];
Defult: --
Context: http,server,location

案例:

limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
server{
    location /{
        limit_req req_zone;
        # 缓存区队列burst=3个,不延期,即每秒最多可处理rate+burst个,同时处理rate个
        limit_req_zone=req_zone burst=3 nodelay;
    }
}
  • $binary_remote_addr 表示远程的IP地址
  • zone=req_zone:10m 表示一个内存区域大小为10M,并且设定了名称为req_zone
  • rate=1r/s 表示请求的速率是1秒一个请求
  • zone=req_zone 表示这个参数对应的全局设置就是req_zone的那个区域内存
  • burst=3 表示请求队列的长度
  • nodelay 表示不延时

连接限制

  • 语法
    • limit_conn_zone
# 可以以IP为key_zone为空间的名称 size为申请空间的大小
Syntax: limit_conn_zone key zone=name:size rate=rate;
Defult: --
Context: http(定义在server之外)
- limit_conn
# zone名称 number限制的数量
Syntax: limit_conn  zone number;
Defult: --
Context: http,server,location

案例:

limit_conn_zone $binary_remote_addr zone=req_zone:1m;
server{
    location /{
        limit_conn conn_zone 1;
    }
}

表明以ip为key,来限制每个ip访问文件时候,最多只能有一个在线,否则其余的都要返回不可用

访问控制

  • 基于IP的访问控制 _http_access_module

  • 基于用户的信任登录 _http_auth_basic_module

  • http_access_module

Syntax: allow address|all;
Default: --
Context: http,server,location,limit_except
Syntax: deny address|CIDR|all;
Default: --
Context: http,server,location,limit_except
server{
    location ~ ^/admin.html{
        deny 192.171.207.100;
        allow all;
    }
}

CIDR: 例如:deny 192.168.20.1/24

不记得的话,要仔细看看CIDR相关

server{
    location ~ ^/admin.html{
       if($http_x_forwarded_for !~* "^8\.8\.8\.8"){
           return 403;
       }
    }
}
符号 含义
= 严格匹配,如果这个查询匹配,那么将停止搜索并立即处理此请求
~ 为区分大小写匹配(可用正则表达式)
!~ 为区分大小写不匹配
~* 为不区分大小写匹配(可用正则表达式)
!~* 为不区分大小写不匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx如果路径匹配那么不测试正则表达式
  • http_auth_basic_module
Syntax: auth_basic string|off;
Default: auth_basic off;
Context: http,server,location,limit_except
Syntax: auth_basic_user_file file;
Default: -;
Context: http,server,location,limit_except
htpasswd -c /etc/nginx/user.conf zhangsan
server{
    auth_basic '请登录';
    auth_basic_user_file /opt/app/user.conf; # 注意这个文件名是随意的
}

重点

安装node建议使用 nvm  利用github的nvm安装指令安装好之后,直接nvm安装node

https://github.com/nvm-sh/nvm

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash

可能需要翻墙:实在下不下来只能先更新apt的源然后安装apt上面的node版本

nvm install stable  稳定版

使用

location ~ ^/api{
    proxy_pass http://127.0.0.1:3000;
}

以api开头的路径,则代理给本地3000端口的服务器

http_gzip_static_module

  • 先找磁盘上找同名的.gz这个文件是否存在,节约CPU的压缩时间和性能损耗
  • http_gzip_static_module 预计gzip模块
  • http_gunzip_module 应用支持gunzip的压缩方式
类型 种类
语法 gzip_static on/off
默认 gzip_static off;
上下文 http server location
  • 案例
    /etc/ngxin/conf.d/default.conf
location ~ .*\.(jpg|png|gif)${
    gzip off;# 关闭压缩
    root /data/www/images;
}
location ~ .*\.(html|js|css)${
    gzip on;
    gzip_min_length 1k; #只压缩超过1K的文件
    gzip_http_version 1.1; # 启用gzip压缩所需的HTTP最低版本
    gzip_comp_level 9; # 压缩级别,数值越大,文件被压缩的体积越小
    gzip_types text/css application/javascript;# 进行压缩的文件类型
    root /data/www/html;
}
location ~ ^/download{
     gzip_static on; # 先找同名的.gz文件,提升性能
     tcp_nopush on; # 不着急,攒一波再发
     root /data/www; # 注意此目录是/data/www而不是/data/www/download
}

浏览器缓存

6.jpg
  • expires

添加Cache-Control、Expires头

类型 种类
语法 expires time
默认 expires off;
上下文 http server location
location ~ .*\.(jpg|png|gif)${
    expires 24h;# 缓存过期是24H
}

但是不是所有浏览器都按照上图走,例如chrome:如果请求过了,缓存还没过期,则地址栏输入地址,或者刷新或者enter则仍然会请求;
但是,如果html里面连接图片地址,则不会重新请求,会直接走缓存

跨域

跨域是指一个域下的文档或脚本试图去请求另一个域下的资源

类型 种类
语法 add_header name value
默认 add_header --;
上下文 http server location
location ~ .*\.json${
    add_header Access-Control-Allow-Origin http:localhost:3000;
    add_header Access-Control-Allow-Methods GET POST PUT DELETE OPTIONS;
    root /data/json;
}

防盗链

  • 防止网站资源被盗用
  • 保证信息安全
  • 防止流量过量
  • 需要区别哪些请求是非正常的用户请求
  • 使用http_refer防盗链
类型 种类
语法 vaild_referers none、block、server_names、IP
默认 -;
上下文 server location
location ~ .*\.(jpg|png|gif)${
    #none没有refer blocked 47.104.184.134
    valid_referers none blocked  47.104.184.134;
    if($invalid_referer){# 验证通过为0 不通过为1
        return 403;
    }
    root /data/images;
}

其实就是查看refer是不是合法网站,不是的话,不让访问图图片;当然一般情况下,通过浏览器直接访图片是没有refer,而且一般也不会限制这种形式的访问

curl -e "http://www.baidu.com" http://192.168.163.10/a.jpg

但是可以利用一些工具,设置请求时候的refer

代理服务

类型 种类
语法 proxy_pass URL
默认 -
上下文 server location

正向代理

  • 正向代理的对象是客户端,服务端看不到真正的客户端
  • 通过公司的代理服务器上网


    7.jpg
server{
    location ~ ^/admin.html{
        # 只允许8.8.8.8访问
        if($http_x_forwarded_for !~* "^8\.8\.8\.8"){
            return 403;
        }
    }
}
resolver 8.8.8.8 # 谷歌的域名解析地址
location /{
    # $http_host 要访问的域名解析地址
    proxy_pass http://$http_host$request_uri;
}

反向代理

  • 反向代理的对象是服务端,客户端看不到真正的服务端
  • nginx代理应用服务器

负载均衡

nginx把请求转发到后台的一组upstream服务池

类型 种类
语法 upstream name{}
默认 -
上下文 http

域名对应多个IP,每个ip对应一个nginx,每个nginx可以反向代理多台服务器或者多个服务,实现负载均衡

upstream zq{
    server 127.0.0.1:3000 weight=10;
    server 127.0.0.1:3001;
    server 127.0.0.1:3002;
}
server {
    location /{
        proxy_pass http://zq;
    }
}

  • 后端服务器调试状态
状态 描述
down 当前的服务器不参与负载均衡
back_up 当其他节点都无法使用时的备份的服务器
max_fails 允许请求失败的次数,到达最大次数就会休眠
fail_timeout 经过max_fails失败后,服务暂停的时间,默认色10秒
max_conns 限制每个server最大的接收的连接数,性能高的服务器可以连接数多一些
upstream zq{
    server 127.0.0.1:3000 weight=10;
    server 127.0.0.1:3001 max_fails=1 fail_timeout=10s; #组合使用
    server 127.0.0.1:3002 backup;
}
  • 分配方式
类型 种类
轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,自动剔除
weight(加权轮询) 指定寻论几率,weight和访问比例成正比,用于后端服务器性能不均衡的情况
ip_hash 每个请求按访问的IP的hash结果分配,这样每个访客固定访问一个后端服务器,解决session问题
least_conn 哪个机器链接数少就分发给谁
url_hash(第三方) 按访问的url来分配请求,每个url都定向到同一个后端服务器上(缓存)
fair(第三方 ) 按后端服务器的响应时间来分配请求,响应时间短的优先分配
正定义hash hash自定义key
upstream zq{
    ip_hash;
    server 127.0.0.1:3000;
}

upstream zq{
least_conn;
server 127.0.0.1:3000;
}

upstream zq{
    hash $request_url;
    server 127.0.0.1:3000;
}

rewirte

用途

  • URL页面跳转
  • 兼容旧版本
  • SEO优化
  • 转发
  • 安全(伪静态)
类型 种类
语法 rewrite regex replacement [flag]
默认 -
上下文 server location if

rewrite ^(.*)$ /wwww/reparing.html break;

  • flag
flag 含义
last 停止rewrite检测
break 停止rewrite检测
redirect 返回302暂时重定向
permanent 返回301永久重定向
location ~ ^/break{
    rewrite ^/break/test/ break;
}
location ~ ^/last{
    rewrite ^/last/test/ last;
}
location /last/{
    default_type application/json;
    return 200 '{"code":0,"msg":"success"}'
}
location ~ ^/redirect{
    rewrite ^/redirect http://www.baidu.com redirect;
    rewrite ^/redirect http://www.baidu.com permanent;
}

使用案例

Nginx 反向代理配置

  1. 关闭 Selinux
    • vi etc/selinux/config
    • 修改 SELINUX=enforcing 为 SELINUX=disabled
    • 必须重启 linux init 6
  2. 配置 firewalld 开启 80 端口
    • firewall-cmd --zone=public --list-ports
    • firewall-cmd --zone=public --add-port=80/tcp --permanent
  3. 配置反向代理
    • 找到 /etc/nginx/conf.d 然后在里面新建对应网站的配置文件


      图2.png
server {
    listen 80; 
    server_name www.bbb.com;
    location / {
        #设置主机头和客户端真实地址,以便服务器获取客户端真实 IP
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #禁用缓存
        proxy_buffering off;
        #反向代理的地址
        proxy_pass http://127.0.0.1:3001;
}
  1. 重启 nginx
* systemctl restart nginx
* nginx -t 看配置是否正确
* systemctl stop nginx
* systemctl start nginx

域名测试

找到 C:\Windows\System32\drivers\etc\hosts

* 192.168.1.128
* 192.168.1.128 www.bbb.com

浏览器输入www.aaa.com nginx 转发到了 127.0.0.1:3001

Nginx 负载均衡


  1. 准备工作:1、关闭 Selinux 2、开启防火墙对应端口
  2. 负载均衡的种类:
    • 一种是通过硬件来进行解决,常见的硬件有 NetScaler、F5、Radware 和 Array 等商用的
      负载均衡器,但是它们是比较昂贵的
    • 一种是通过软件来进行解决的,常见的软件有 LVS、Nginx、apache 等,它们是基于 Linux
      系统并且开源的负载均衡策略. Nginx 的特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现最好,中国大陆使用 nginx 网站用户有:新浪、网易、 腾讯等。
  3. nginx 的 upstream 目前支持 3 种方式的分配:
    • 轮询(默认)
      每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,
      能自动剔除。
    • weight 权重 ——you can you up
      指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
    • ip_hash ip 哈希算法
      每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,
      可以解决 session 的问题。
  4. 配置负载均衡
    找到 /etc/nginx/conf.d 然后在里面新建对应网站的配置文件

图2.png
upstream bakebbs {
    ip_hash; 
    server 127.0.0.1:3001 weight=1 ; 
    server 127.0.0.1:3001 weight=3;
}
server {
    listen 80; 
    server_name www.bbb.com;
    location / {
        #设置主机头和客户端真实地址,以便服务器获取客户端真实 IP
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #禁用缓存
        proxy_buffering off;
        #反向代理的地址
        proxy_pass http://bakebbs;
    }
}
  1. 重启 nginx
* systemctl restart nginx
* nginx -t 看配置是否正确
* systemctl stop nginx
* systemctl start nginx

相关防火墙配置

* 添加:
firewall-cmd --zone=public --add-port=80/tcp --permanent
* 重新载入:
firewall-cmd --reload
* 查看
查看所有打开的端口: firewall-cmd --zone=public --list-ports
* 删除
firewall-cmd --zone= public --remove-port=3306/tcp --permanent

静态资源

    1. 在nginx目录下创建测试目录staticres,存放静态资源,如index.html
    2. 配置文件nginx/conf/nginx.conf
    http {
        ......

        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';  #自定义日志格式,别名为main
        ......

        gzip on;    # 开启gzip压缩,默认是关闭的
        gzip_min_length 1;  #当资源文件大于1B时,开启压缩;低于1B时,一个TCP报文就可以发送了,没必要浪费CPU资源去压缩
        gzip_comp_level 2;  #压缩级别
        gzip_types text/plain application/x-javascript text/css application/xml text/javascript
                    application/x-httped-php image/jpeg image/gif image/png;    #压缩的文件类型
    
        server {
            listen 8080;    #监听8080端口
            server_name localhost;  #本机IP地址
            access_log  logs/host.access.log  main; #记录访问日志,指定日志路径和使用的格式main
            location / {    #定位 http://localhost:8080 下的资源位置
                alias staticres/; #指定资源目录,向nginx/staticres目录下查找资源
                index   index.html index.php;  #配置欢迎页,默认初始页为index.html
            }
        }
    }
    1. 访问:http://localhost:8080  --> 默认定位到 staticres/index.html
    2. root 和 alias 指令都用于指定文件路径
        1. root
            语法:root path
            默认值:root html
            作用指令节点:http、server、location、if
        2. alias
            语法:alias path
            作用指令节点:location
        3. root与alias主要区别在于Nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上;
            1. root的处理结果:root路径+location路径
            2. alias的处理结果:使用alias路径替换location路径
            location ~ ^/weblogs/ {
                root /www/html/;
                alias /www/html/;
            }
            3. 如果一个请求的URI是/weblogs/a.html,root指令会返回服务器上的 /www/html/weblogs/a.html 的文件;
            alias指令会返回服务器上的 /www/html/a.html 的文件,即 alias指令会丢弃 location 后的路径 /weblogs/
            4. 还有一个重要的区别:alias后面必须要用 / 结束,否则会找不到文件,而root则可有可无.
    3. 当URL访问目录时,以列表的形式直接列出目录下的文件
      location / {
          alias staticres/;
          index abc123abc.html;  #指定一个不存在的名字,否则默认访问index.html
          autoindex on;   #借助nginx模块ngx_http_autoindex_module
      }
    4. 限制用户访问的带宽
        1. 公网带宽是非常有限的,高并发的用户形成一个争抢关系,当有用户访问大文件时,应限制其带宽,
        以分离出足够的带宽,让其他用户访问到必要的小文件,如CSS文件、JS文件等
        2. 使用 set 命令 + 内置变量
        location / {
            ...
            set $limit_rate 1k;
        }
        3. $limit_rate 表示限制用户的响应速度,1k表示每秒传输1KB
    5. 日志记录
        1. log_format:定义日志格式和别名
        2. main 表示日志格式的别名,不同的日志需要不同的格式

反向代理

    在nginx/conf/nginx.conf中配置
        http {
            ......
            upstream local {    # 配置上游服务器
                server 127.0.0.1:8080;  --> 转发给本机上的监听8080端口的服务
            }
            server {
                server_name test.abc.cn;
                listen 80;
                location / {
                    # 让上游服务器获得真实的用户IP
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                    proxy_pass http://local; #Nginx代理转发给上游服务器
                }
            }
        }
    1. 配置了反向代理之后,浏览器是和Nginx服务器直接建立的连接,Nginx又和上游服务器建立连接,
       那么上游服务器获取的域名和IP其实是Nginx服务器的,而不是浏览器的;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    2. 它们三者的作用就是把浏览器的域名和IP转交给上游服务器;
    3. proxy_cache:缓存配置,让Nginx缓存一些不常变化的数据,利用Nginx的高性能,高效处理请求;
        proxy_cache_path /tmp/nginx levels=1:2 
            keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
        server {
            ...
            location / {
                ......
                proxy_cache my_cache;  #缓存的共享内存名
                proxy_cache_key $host$uri$is_args$args; 
                proxy_cache_valid 200 304 302 ld;  #指定不返回的响应
                proxy_pass http://local;  #反向代理
            }
        }
        1. proxy_cache_path:设置缓存路径,大小,文件命名方式等信息;
           共享内存命名为my_cache,大小为10M,路径为/tmp/nginx
        2. proxy_cache_key:设置缓存的key,同一个URL对不同用户的展示内容可能是不同的,
           用户作为一个变量,以 key-value 的形式缓存共享内存中;
        3. proxy_cache_valid:状态为 200 304 302 的缓存内容,在 1天 后过期;
        4. proxy_ignore_headers Set-Cookie Cache-Control;   #尤其要忽略set-cookie

负载均衡

    反向代理引出了服务器集群的负载均衡
        http {
            upstream nodes {
                
            }
            server {

            }
        }
    1. upstream指令用于配置上游服务器,可以有多个 upstream指令,一个 upstream指令又可以配置多个上游服务器;
    2. upstream指令对配置的上游服务器按照默认的轮询方式进行请求。如果上游服务器挂掉,能自己主动剔除,无需手动干预;
    3. 但如果上游服务器在配置不均衡的情况下,是解决不了负载均衡的,所以还需要nginx的其他配置;

upstream配置

权重配置

1. weight和请求数量成正比,主要用于上游服务器配置不均衡的情况下
    upstream nodes {
        server 192.168.10.1:8668 weight=5;
        server 192.168.10.2:8668 weight=10;
    }
2. 192.168.10.2机器的请求量是192.168.10.1机器的2倍

ip_hash配置

每一个请求按照请求ip的hash结果分配,这样每一个请求固定访问同一个上游服务器,能够解决ip会话在同一台服务器的问题
    upstream nodes {
        ip_hash;
        server 192.168.10.1:8668 weight=5;
        server 192.168.10.2:8668 weight=10;
    }

fair配置

按上游服务器的响应时间来分配请求,响应时间短的优先分配
    upstream nodes {
        server 192.168.10.1:8668 weight=5;
        server 192.168.10.2:8668 weight=10;
        fair;
    }

url_hash配置

    按照访问url的hash结果来分配请求,使每一个url定向到同一个上游服务器
        upstream nodes {
            server 192.168.10.1:8668 weight=5;
            server 192.168.10.2:8668 weight=10;
            hash $request_uri;
            hash_method crc32;  #使用的hash算法
        }

upstream的常用配置项

    1. down:表示当前的server不參与负载均衡
    2. weight:默认1,weight越大,负载的权重就越大,分配到请求的几率越大
    3. max_fails:请求失败的次数,默认1
    4. fail_timeout : max_fails次失败后,暂停请求此台服务器的时间
    5. backup:其他全部的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻
    upstream nodes {
        ip_hash;
        server 192.168.10.1:8668 down;
        server 192.168.10.2:8668 weight=2;
        server 192.168.10.3:8668;
        server 192.168.10.4:8668 backup;
    }

server指令节点

    server {
        listen       80;    #Nginx监听的端口号
        server_name  www.test.com;  # 访问的域名

        location / {
            root   /root;   #定义服务器的默认网站根目录位置
            index index.php index.html index.htm;   #定义首页索引文件的名称

            #以下是一些反向代理的配置可删除.
            proxy_redirect off;

            #让上游Web服务器可以获取用户的真实IP
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            client_max_body_size 10m;   #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;   #缓冲区代理缓冲用户端请求的最大字节数,
            proxy_connect_timeout 90;   #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;  #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;  #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;   #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;    #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k; #设定缓存大小,大于这个值,将从upstream服务器传
            ......

            proxy_pass  http://nodes;  #请求转向
            proxy_connect_timeout  500ms;  #Nginx连接上游服务器的超时时间,默认60s
        }

        location /buy {
            proxy_pass   http://172.18.144.23:5789/;  # 转发到指定服务器
        }
        
        error_page   500 502 503 504  /50x.html;
        
        location = /50x.html {
            root   html;
        }
    }
    1. 为了便于管理,可以在 nginx/conf 下创建目录如vhost
    2. 在vhost目录下新建一些文件,如a.conf,b.conf,c.conf,在其中管理server等指令节点
    3. 在主配置配置文件 nginx/conf/nginx.conf 中,使用 include 引入其他配置文件
        http {
            include vhost/*.conf;   #引入nginx/conf/vhost目录下的、后缀名为.conf的文件
        }

配置nginx集群访问

             upstream lbs {

                server 120.79.160.143:8082;   
                server 127.0.0.1:8080;      

            }

            location /api/ {
                    proxy_pass http://lbs;
                    proxy_redirect default;
                }
            location /user/ {
                    proxy_pass http://lbs;
                    proxy_redirect default;
                }

意思就是访问nginx对应的ip或者网址且有/api/以及子接口则转发到lbs(名称不固定)对应的节点,但是具体到
哪个节点看负载均衡算法的配置,同理/user/以及子接口也转到到lbs(当然也可以是其他upstream上)的节点上

HTTPS的配置

HTTPS


  • HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP
    通道,简单讲是 HTTP 的安全版。
  • HTTPS 是在 HTTP 的基础上添加了安全层,从原来的明文传输变成密文传输,当然加密与解
    密是需要一些时间代价与开销的,不完全统计有 10 倍的差异。在当下的网络环境下可以忽
    略不计,已经成为一种必然趋势。
  • 目前微信小程序请求 Api 必须用 https、Ios 请求 api 接口必须用 https

配置 https

  1. 证书类型

  1. 域名型 https 证书(DVSSL):信任等级一般,只需验证网站的真实性便可颁发证书保护网站;
  2. 企业型 https 证书(OVSSL):信任等级强,须要验证企业的身份,审核严格,安全性更高;
  3. 增强型 https 证书(EVSSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高,同时可以激活绿色网址栏

  1. 创建证书


    图1.png
  1. 证书验证

可以是域名验证,也可以是文件验证

  1. 配置 web 服务器

https://cloud.tencent.com/document/product/4004143#2.-nginx-.E8.AF.81.E4.B9.A6.E9.83. A8.E7.BD.B2

将域名 www.domain.com 的证书文件 1_www.domain.com_bundle.crt 、私钥文
件 2_www.domain.com.key 保存到同一个目录,例如 /usr/local/nginx/conf 目录下。
更新 Nginx 根目录下 conf/nginx.conf 文件如下:

server {
    listen 443;
    server_name www.domain.com; #填写绑定证书的域名
    ssl on;
    ssl_certificate 1_www.domain.com_bundle.crt;
    ssl_certificate_key 2_www.domain.com.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
    ssl_prefer_server_ciphers on;
    location / {
        root html; #站点目录
        index index.html index.htm;
    }

配置完成后,先用 bin/nginx –t 来测试下配置是否有误,正确无误的话,重启 nginx。就可以使用 https://www.domain.com 来访问。

图2.png

你可能感兴趣的:(Nginx)