什么是 nginx

nginx 是一款高性能的 http 服务器,反向代理服务器,电子邮件(IMAP/POP3)代理服务器;

它的特点就是高性能,占用内存少,支持高并发,运行稳定;

官方测试 可支持 5万 的并发量;

nginx 的用途

nginx 可以用于多种场景,最常用的是反向代理,其他场景也需要反向代理实现

http 服务器:nginx 是一个 http 服务器,可以独立提供 http 服务,可以做 web 静态资源服务器

正向代理:客户端代理

反向代理:反向代理是它最重要,也是最常用的一个场景

负载均衡:把多个请求近似平均的分配到多个服务器上

  // 也就是说负载均衡需要多个服务器       【一个服务器多个端口应该也行,我没试过,使用时请自行测试】

  // 负载均衡的本质其实也是反向代理

动静分离:把 web 静态资源和动态资源放在不同的服务器上,然后加上反向代理

配置高可用集群:组件分布式 nginx,防止 单 nginx 宕机导致 web 服务挂掉

功能框架

常规 web 框架

我们先看下常规 web 服务的 请求响应 过程,加入后台需要操作数据库,如下图

开发环境的 web 服务器是单线程的,多个请求必须排队

反向代理

nginx 作为反向代理,隐藏真实 IP,在 windows 上配置 域名-ip 解析器,使用域名通过 代理(nginx) 访问 真实服务(tomcat)

负载均衡

把 多个 request 平均分配到 多个 服务器上,避免单服务器的排队,提高并发

动静分离

把 web 动态资源和静态资源 分开存储

安装

nginx 安装有多种方式,详细过程 参照 官方安装文档,这里只简单介绍 tar 包安装。

nginx 需要安装依赖

//一键安装四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

下载 tar 包并解压,下载地址 官网下载,进入目录,执行如下命令

./configure
make
make install

解压后如下图

简单配置

nginx 默认 80 端口,这个端口一般被 apache 占用,默认 IP一般是 localhost,由于我们经常会搞一些其他事情把 hostname 改掉,所以这里先换成 IP

 server {
listen 8765;
server_name localhost;

启动并查看版本

[root@node conf]# /usr/local/nginx/sbin/nginx
[root@node conf]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.16.1

/usr/local/nginx/sbin 就是上图那个解压后的 sbin

可以看到安装成功

web 端可访问

常用命令

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 的版本,编译器版本和配置参数。
nginx         启动

详细配置

配置文件解读

     1  worker_processes  1;         #worker进程的数量

     2  events {                    #事件区块开始
3 worker_connections 1024; #每个work进程支持的最大连接数
4 } #事件区块结束 5 http { #http区块开始
6 include mime.types; #nginx支持的媒体类型库文件包含
7 default_type application/octet-stream; #默认的媒体类型
8 sendfile on; #开启高效传输模式
9 keepalive_timeout 65; #连接超时 10 server { #第一个server区块开始,表示一个独立的虚拟主机站点
11 listen 80; #提供服务的端口,默认80
12 server_name localhost; #提供服务的域名主机名 13 location / { #第一个location区块开始
14 root html; #站点的根目录,相对于nginx安装目录
15 index index.html index.htm;
16 }
17 error_page 500 502 503 504 /50x.html;
18 location = /50x.html {
19 root html;
20 }
21 }
22 }

反向代理配置

server {
listen 80;
server_name localhost;
client_max_body_size 1024M; location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host:$server_port;
}
}

上面是 反向代理的 IP:PORT,下面是被代理的 服务, / 对应 url, 当访问 localhost:80 时,相当于访问 localhost:8080

负载均衡配置

负载均衡需要分配 request 到不同服务器,那如何分配呢?有几种策略

RR 策略

nginx 的默认策略,按时间顺序把请求逐个分配到不同服务器,如果某个服务器挂掉,会自动剔除。

upstream test {
server localhost:8080;
server localhost:8081;
}
server {
listen 80;
server_name localhost;
client_max_body_size 1024M; location / {
proxy_pass http://test;
proxy_set_header Host $host:$server_port;
}
}

upstream  代表多个服务器,假如有个服务器挂掉了,nginx 会自动判断,不给他分配 request,所以不影响 web 的使用。

注意 upstream 后面的 test 与 http 后面的要保持一致

权重策略

给每台服务器分配权重,权重大的越容易被分配 request,性能好的机器自然权重大,这种策略就是用于 服务器性能 差异较大的场景。

upstream test {
server localhost:8080 weight=9;
server localhost:8081 weight=1;
}
server {
listen 80;
server_name localhost;
client_max_body_size 1024M; location / {
proxy_pass http://test;
proxy_set_header Host $host:$server_port;
}
}

比如有 10 个 request,可能 8080 处理 9 个,8081 处理 1 个

还有 ip_hash 策略,包括上面两种是 nginx 自带的策略;

还有第三方策略 fair 策略、url_hash 策略,具体配置我就不写了,大同小异,参考 各种策略的详细配置

参考资料:

http://www.nginx.cn/doc/index.html  Nginx中文文档

https://blog.csdn.net/weixin_41835612/article/details/83738188  有具体配置

https://www.cnblogs.com/xiaohuochai/p/9093819.html  有具体配置

https://www.jianshu.com/p/15e7f2adb463  有具体配置

https://www.jianshu.com/p/15e7f2adb463   有具体配置

https://www.cnblogs.com/ysocean/p/9392908.html  理论挺详细

https://blog.csdn.net/duguyuyun12345/article/details/83471821  Nginx使用教程

Nginx教程(一)-全面认知的更多相关文章

  1. Nginx教程(四) Location配置与ReWrite语法

    Nginx教程(四) Location配置与ReWrite语法 1 Location语法规则 1.1 Location规则 语法规则: location [=|~|~*|^~] /uri/ {- } ...

  2. Nginx教程(三) Nginx日志管理

    Nginx教程(三) Nginx日志管理 1 日志管理 1.1 Nginx日志描述 通过访问日志,你可以得到用户地域来源.跳转来源.使用终端.某个URL访问量等相关信息:通过错误日志,你可以得到系统某 ...

  3. Nginx教程(二) Nginx虚拟主机配置

    Nginx教程(二) Nginx虚拟主机配置 1 虚拟主机管理 1.1 Nginx管理虚拟主机 虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主 ...

  4. Nginx教程(一) Nginx入门教程

    Nginx教程(一) Nginx入门教程 1 Nginx入门教程 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行.由 ...

  5. Nginx 教程(1):基本概念

    简介 嗨!分享就是关心!所以,我们愿意再跟你分享一点点知识.我们准备了这个划分为三节的<Nginx教程>.如果你对 Nginx 已经有所了解,或者你希望了解更多,这个教程将会对你非常有帮助 ...

  6. Nginx教程

    Nginx教程 1.背景 介绍 Nginx是一个高性能的HTTP服务器,以及反向代理服务器 组成 Ngnix有内核和模块组成.微结构的内核根据配置文件将一个请求映射到一个location块中,该loc ...

  7. nginx教程从入门到精通

    [转]nginx教程从入门到精通 nginx教程写了一段时间,无意中发现,nginx相关文章已经达到了近100篇了.觉得很有必要汇总到一起,它是我们运维生存时间的一片心血,他是学习nginx的同学必看 ...

  8. Nginx教程收集

    学习要系统,最推荐的方式是看书. 下面是收集的一些Nginx教程: https://www.gitbook.com/book/yinsigan/nginx/details http://www.ngi ...

  9. agentzh 的 Nginx 教程(版本 2019.07.31)

    agentzh 的 Nginx 教程(版本 2019.07.31) agentzh 的 Nginx 教程(版本 2019.07.31) https://openresty.org/download/a ...

随机推荐

  1. C语言写数据库(二)

    简单的实现增删查改的操作后,实现了一个先读写其中一个表的某两项内容,再把相关字符段写入到另外一张表中去.涉及到查询和插入两个步骤. 其中还涉及到汉字的读写和插入,会有字符的操作产生乱码.所以要先保证m ...

  2. php的 strval函数

    官方的解释 PHP strval() 函数 PHP 可用的函数 strval() 函数用于获取变量的字符串值. PHP 版本要求: PHP 4, PHP 5, PHP 7 语法 string strv ...

  3. LinkedList类源码浅析(二)

    1.上一节介绍了LinkedList的几个基本的方法,其他方法类似,就不一一介绍: 现在再来看一个删除的方法:remove(Object o) remove方法接受一个Object参数,这里需要对参数 ...

  4. springboot+mybatis 使用事务

    一.一些概念 声明式的事务管理是基于AOP的,在springboot中可以通过@Transactional注解的方式获得支持,这种方式的优点是: 1)非侵入式,业务逻辑不受事务管理代码的污染. 2)方 ...

  5. vue一些注意事项

    1.生命周期钩子的 this 上下文指向调用它的 Vue 实例. 不要在选项属性或回调上使用箭头函数,比如 created: () => console.log(this.a) 或 vm.$wa ...

  6. Linux Bash shell常用操作快捷键

    转自:https://linuxtoy.org/archives/bash-shortcuts.html 生活在 Bash shell 中,熟记以下快捷键,将极大的提高你的命令行操作效率. 编辑命令 ...

  7. Git:本地项目与远程仓库的git/clone

      版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_40197828/article/details/79283278 初识Git命令行将本地项 ...

  8. What is the most efficient way to deep clone an object in JavaScript?

    What is the most efficient way to deep clone an object in JavaScript? Reliable cloning using a libra ...

  9. java实现二分法查找

    一 前提 使用二分法查找的前提是:有序的数组,没有重复的数据元素.如果没有排序过的,需先排序. 二分法查找时使用场景为:数据量较大时 二 代码 package com.xiao.day01; publ ...

  10. Array 操作

    一.数组拉平 function arrayFlat(arr) { return arr.reduce((pre, cur) => { const temp = Array.isArray(cur ...