Nginx

功能

  • web 服务器
  • 负载均衡
  • 反向代理

特点

  • 网络 I/O 模型:epoll、kqueue
  • 支持高并发连接(并发连接数:测试环境 5w,生产环境 2~4w )
  • 执行效率极高,内存、CPU等系统资源消耗低,运行稳定
  • 配置简单灵活
  • 支持 rewrite 重写规则
  • 内置健康检查
  • 节省带宽
  • 支持热部署
  • 成本低

安装

  • github:https://github.com/nginx/nginx/releases
  • 编译依赖:GCC、make、Autoconf、Automake
  • 运行依赖:zlib 库、pcre 库、openssl 库
  • 源码安装
unzip nginx-1.17.4.zip
cd nginx-1.17.4
./configure
make
sudo make install

Nginx 管理命令

  • 启动
$NGINX_BIN_PATH/nginx -c $NGINX_CONF_PATH/nginx.conf
-c 参数用于指定配置文件,不指定时使用默认的配置文件

  • 校验配置文件语法
$NGINX_BIN_PATH/nginx -t -c $NGINX_CONF_PATH/nginx.conf

  • Nginx 主进程号获取
ps -ef | grep nginx | grep "master"
或
cat $NGINX_PID_PATH/nginx.pid

  • 系统信号控制命令
kill -系统信号 `$NGINX_PID_PATH/nginx.pid`
系统信号选项
TERM/INT:快速关闭
QUIT:从容关闭
HUP:平滑重启,重新加载配置文件
USR1:重新打开日志文件,用于切割日志
USR2:平滑升级可执行程序
WINCH:从容关闭工作进程

  • Nginx 平滑重启:不中断服务,应用新的配置文件
  • Nginx 平滑升级:不中断服务,替换 Nginx 可执行程序

Nginx 配置文件:nginx.conf

# 指定用户和组
user www www;
# 指定工作进程数,一般为主机 CPU 数或其两倍
worker_processes 8;
# 指定错误日志文件及打印级别,选项:[debug|info|notice|warn|error|crit]
error_log $NGINX_ERROR_LOG_PATH/nginx_error.log crit;
pid $NGINX_PID_PATH/nginx.pid;# 指定主进程号文件
worker_rlimit_nofile 51200;# 指定文件描述符数量
events
{# 指定使用的网络 I/O 模型:Linux 使用 epoll,FreeBSD 使用 kqueueuse epoll;# 允许连接数worker_connections 51200;
}
http
{# 设置字符集,需要根据 HTML 代码中的 Meta 标签设置# charset utf-8;# 设置客户端能够上传的文件大小client_max_body_size 8m;sendfile on;# tcptcp_nopush on;tcp_nodelay on;keepalive_timeout 60;# 基于 IP 的虚拟主机server{...}# 基于域名的虚拟主机server{...}# 基于端口的虚拟主机server{...}
}

虚拟主机配置

  • 基于 IP 的虚拟主机
IP 别名:一块物理网卡绑定多个 IP 地址
每个 IP 地址可对应一个基于 IP 的虚拟主机
IP 别名可通过标准网络配置工具(ifconfig、route等)配置,配置命令写入到 /etc/rc.local 可主机重启失效
ifconfig eth0:1 192.168.16.21 broadcast 192.168.16.255 netmask 255.255.255.0 up
route add -host 192.168.16.21 dev eth0:1
ifconfig eth0:2 192.168.16.22 broadcast 192.168.16.255 netmask 255.255.255.0 up
route add -host 192.168.16.22 dev eth0:2
...
http
{...server{# 设置监听IP地址及端口号,只写端口则监听该服务器上所有 IP 地址的指定端口号listen 192.168.16.21:80;# 设置主机名server_name 192.168.16.21;# 访问日志存放路径access_log $NGINX_ACCESS_LOG_PATH/$server_name.access.log  combined;location /{index index.html index.htm;root $PREFIX_SERVER_PATH/$server_name;}}server{listen 192.168.16.22:80;server_name 192.168.16.22;access_log $NGINX_ACCESS_LOG_PATH/$server_name.access.log  combined;location /{index index.html index.htm;root $PREFIX_SERVER_PATH/$server_name;}}
}

  • 基于域名的虚拟主机
配置 DNS 服务器,每个主机名映射到正确的 IP 地址
配置 Nginx 服务,令其识别不同的主机名
多个虚拟主机可共享同一个 IP 地址,有效解决 IP 地址不足问题
...
http
{...server{listen 80;server_name w3.domain.com;access_log $NGINX_ACCESS_LOG_PATH/$server_name.access.log combined;location /{index index.html index.htm;root $PREFIX_SERVER_PATH/$server_name;}}server{listen 80;server_name a3.domain.com *.domain.com;access_log $NGINX_ACCESS_LOG_PATH/$server_name.access.log combined;location /{index index.html index.htm;root $PREFIX_SERVER_PATH/$server_name;}}
}

  • 基于端口的虚拟主机
...
http
{...server{listen 80;server_name 192.168.16.22;access_log $NGINX_ACCESS_LOG_PATH/$server_name.access.log combined;location /{index index.html index.htm;root $PREFIX_SERVER_PATH/$server_name;}}server{listen 8080;server_name 192.168.16.22;access_log $NGINX_ACCESS_LOG_PATH/$server_name.access.log combined;location /{index index.html index.htm;root $PREFIX_SERVER_PATH/$server_name;}}
}

日志文件配置

...
http
{...# 设置日志格式,默认为 combined# name 表示定义的格式名称,格式名称在同一个配置文件中不能重复;# format 表示定义的格式样式;log_format name format [format ...];# 设置日志文件存放路径、格式和缓存大小# format 表示 log_format 指令设置的日志格式名称# buffer=size 表示设置内存缓存区大小# access_log off; 关闭日志记录access_log path [format [buffer=size | off]];server{...server_name a3.domain.com;# 日志文件路径可包含变量,但会有其他限制:# 设置的用户和组必须有该路径创建文件的全新# 缓冲不会被使用# 每记录一条日志,都打开文件,写入日志,关闭文件access_log $NGINX_ACCESS_LOG_PATH/$server_name.access.log combined;# open_log_file_cache 指令设置含有变量日志路径的文件描述符缓存# 默认为 open_log_file_cache off; 禁止使用缓存# max:设置缓存中最大文件描述符数量,超过 max 采用 LRU (Least Recently Used)算法清除“不常用的文件描述符”# inactive:设置文件描述符不使用的连续时间,超时后自动删除,默认 10s# valid:设置日志文件是否存在的查询周期,默认时间 60sopen_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time] | off}
}

日志文件切割

日志文件太大严重影响服务器效率
为方便对日志进行分析,须对日志文件进行定时切割,通常按天切割
切割方法:(可配置 crontab定时切割)
mv XXX_server.access.log XXX_server_timestap.access.log
kill -USR1 `$NGINX_PID_PATH/nginx.pid`

压缩输出配置

gzip 压缩后页面大小变为原来的 30% 甚至更小
需要浏览器(解压缩)和服务器(压缩)双方支持
http
{gzip on
}

自动列目录配置

# 当前目录下不存在用 index 指令设置的默认首页文件
...
http
{...server{...location /{# 设置自动列目录autoindex on;# 设置索引文件大小的单位# on:单位 B# off:单位 KB、MB、GBautoindex_exact_size [on|off]# 开启本地时间显示文件时间的功能,默认关闭autoindex_localtime [on|off]...}}
}

浏览器本地缓存配置

在用户磁盘上对最近请求过的文档进行存储,
用户再次请求该页面时,浏览器直接从用户磁盘读取页面,以加快浏览
可通过 expires 指令实现
语法:expires [time|epoch|max|off]
默认值:off
作用域:http、server、location
用途:控制 HTTP 应答重的 “Expires”和“Cache-Control”的 Header 头信息,
起到缓存的作用

负载均衡与反向代理

  • 释义
多台服务器对称方式组成服务器集群
每台服务器具有等价地位,可单独对外提供服务
通过负载分担技术,可将外部请求按照指定策略分配到集群中的一台服务器
接收请求的服务器独立响应外部请求
Nginx 7 层负载均衡仅支持 HTTP、邮件协议。
反向代理以代理服务器来接收外部网络的连接请求
将请求转发给内部网络的服务器
并将内部网络服务器的响应返回给外部网络客户端

  • 方法
用户手动选择:主站首页提供不同线路、不同服务器链接,如:华军软件园
DNS 轮询:对同一主机名添加多条 A 记录,
DNS 服务器将解析请求按照 A 记录顺序,随机分配到不同的 IP 上。
缺点:
1. 可靠性低,某 A 记录服务器故障后仍会向其请求,
由于各级 DNS 的缓存,即使删除该 A 记录也不能解决问题
2. 负载分配不均衡,简单轮询算法,不能区分服务器差异,
同样受各级 DNS 的缓存影响
4/7 层负载均衡设备:
1. 硬件 4/7 层负载均衡交换机
2. 软件 4 层负载均衡
LVS:IP 负载均衡技术、基于内容请求分发技术、调度器自动屏蔽服务器故障
3. 软件 7 层负载均衡
Nginx:配置灵活,支持轮询、IP 哈希、URL 哈希、权重等,
支持后端服务器的健康检查
多线多地区智能 DNS 解析与混合负载均衡方式:以上各个方式的大综合

  • 配置
1. upstream 指令:
设置一组可在 proxy_pass 指令和 fastcgi_pass 指令中
使用的代理服务器集群,默认使用轮询算法;
2. proxy_pass 指令
3. fastcgi_pass 指令
4. server 指令:
upstream 配置块中的 server 指令用于指定后端服务器的
名称(域名、IP、端口、套接字)和参数
server{...}配置块可通过 proxy_pass 指令和 fastcgi_pass 指令
设置反向代理的 upstream 服务器集群
5. proxy_set_header 指令:用于在向反向代理后端的服务器发起请求时添加指定 Header 的头信息;
当后端服务器有多个基于域名的虚拟主机时,要通过添加 Header 头信息 Host,用于指定请求的域名,
这样后端服务器才能识别该反向代理访问请求由哪一个虚拟主机来处理。通过在反向代理时添加 Header
头信息 X-Forwarded-For,让后端服务器获取到用户的真实 IP。

  • HTTP upstream 模块
1. 对反向代理的服务器集群进行轮询负载均衡
2. 对反向代理的服务器集群进行健康检查
3. 指令
- ip_hash
- server
- upstream

| 指令 | 语法 | 默认值 | 作用域 | 作用 | 参数 | | --- | --- | --- | --- | --- | --- | | ip_hash | ip_hash | none | upstream 配置块 | 将客户端 IP 的请求通过哈希算法定位到同一台后端服务器;当某 IP 的用户在后端服务器 A 登陆后,再访问该站点的其他资源时,能保证其访问的还是后端服务器 A,否则会提示未登录,可通过后端服务器 SESSION 共享解决;无法保证后端服务器的负载均衡,后端服务器配置的权重失效 | | | server | server name [ parameters ] | none | upstream 配置块 | 指定后端服务器的名称(域名、IP 地址、端口号、Unix Socket)和参数 | weight=NUMBER:设置服务器的权重,值越大被分配的客户请求越多,默认为 1;
max_fails=NUMBER:在参数 fail_timeout 指定的时间内对后端服务器请求失败的次数,检测到后端服务器无法连接或发生服务器错误(404 错误除外)则标记失败,不设置默认为 1,设置为 0 时关闭该检查;
fail_timeout=TIME:在经历参数 max_fails 设置的失败次数后,暂停向该服务器分配请求的时间;
down:标记服务器为永久离线状态,用于 ip_hash 指令;
backup:仅在非 backup 服务器全部宕机或繁忙的时候才启用;| | upstream | upstream name {...} | none | http 配置块 | 用于设置一组可以在 proxy_pass 和 fastcgi_pass 指令中使用的代理服务器,默认负载均衡方式为轮询 | | | upstream 模块变量 | $upstream_addr:处理请求的 upstream 服务器地址;
$upstream_status:;
$:upstream 服务器的应答状态;
$upstream_response_time:upstream 服务器响应时间(毫秒),多个响应以逗号或冒号分割;
$upstream_http_$HEADER:任意的 HTTP 协议头信息;| | | | | - 双机主备,高可用

使用两台以上的 Nginx 负载均衡器可实现故障转移与高可用;
双机高可用一般通过虚拟 IP(漂移 IP)方式实现,是基于 Linux/Unix 的 IP 别名技术。
1. 主服务器 + 热备服务器:
主服务器绑定公网虚拟 IP 地址,提供负载均衡服务,热备服务器处于空闲状态;
当主服务器发生故障,热备服务器接管主服务器的虚拟 IP,发送 ARPing 包到公网网关刷新 MAC 地址,提供负载均衡服务。
也可利用 keepalived 软件实现。
2. 双活服务器:
两台服务器均处于活动状态,各自绑定一个公网虚拟 IP,提供负载均衡服务,
当其中一台服务器发生故障时,另一台服务器接管故障服务器的虚拟 IP。
DNS 轮询及虚拟 IP 地址接管。

rewrite 规则

  • 功能
采用 PCRE 语法进行规则匹配,实现 URL 的重写,依赖 PCRE 库。
通过 rewrite 规则,可以实现规范的 URL、根据变量来做 URL 转向及选择配置。

  • 指令

| 指令 | 语法 | 默认值 | 作用域 | 作用 | 参数 | | --- | --- | --- | --- | --- | --- | | break | break | none | server{...}、location{...}、if | 完成当前的规则集 | | | if | if(condition){...} | none | server{...}、location{...} | 检查一个条件是否成立,成立执行大括号内语句,不支持嵌套,不支持多个条件及 && 和 || | | | return | return code | none | server{...}、location{...}、if | 结束规则的执行并向客户端返回状态码 | | | rewrite | rewrite regex replacement flag | none | server{...}、location{...}、if | 根据表达式来重定向 URI,或者修改字符串,重写表达式只对相对路径有效 | | | set | set variable value | none | server{...}、location{...}、if | 定义一个变量并给变量赋值 | | | uninitialized_variable_warn | uninitialized_variable_warn on|off | uninitialized_variable_warn on | server{...}、location{...}、if | 开启或关闭记录关于未初始化变量的告警信息 | | | 相关的全局变量 | | | | | |

Nginx 模块开发

nginx 同一个端口支持 http https_Nginx相关推荐

  1. nginx 同一个端口同时 支持 http 和 https

    遇到一个场景: 开始测试时,使用的是 88 端口,比如 www.abc.com:88 后来上线了切换到 80 端口,www.abc.com, 然后升级到 https 默认使用443端口,https:/ ...

  2. nginx同一个地址端口代理多个页面

    有时候在使用nginx代理页面是,会需要一个ip地址同一个端口代理多个前段页面,可能是angular页面,可能是静态页面,这时在一个server中配置就会出现只有一个起作用的情况,所以就需要做一些特别 ...

  3. n2n内网穿透打洞部署全过程 + nginx公网端口映射

    内网穿透.打洞工具有很多,此前在windows上使用的是vidcc这个玩意,也正因为linux不支持.自此在linux尝试过一些打洞工具,ssh 反向代理这些,因为安全性不便捷等多种原因,最终选择了n ...

  4. SSLH:让 HTTPS 和 SSH 共享同一个端口

    转载来源 :SSLH:让 HTTPS 和 SSH 共享同一个端口:http://www.safebase.cn/article-258224-1.html 摘要: 如果你遇到大多数端口被防火墙阻止的情 ...

  5. 如何多个进程监听同一个端口

    1. 问题描述 一个进程监听端口,经验告诉我们,如果多次启动一个进程会报错:"Address already in use!".这是由于bind函数导致的,由于该端口号已经被第一个 ...

  6. 使用nginx 同一端口根据不同域名转发到不同端口

    该文章属于原创类型,其他网站转载必须来源于蚂蚁课堂www.itmayiedu.com 需求:在一台服务器上部署两个tomcat项目,都想共用同一个端口号80.但是一台服务器tomcat端口号不能重复? ...

  7. Linux中不同进程同一个端口,linux系统实现多个进程监听同一个端口

    通过 fork 创建子进程的方式可以实现父子进程监听相同的端口. 方法:在绑定端口号(bind函数)之后,监听端口号之前(listen函数),用fork()函数生成子进程,这样子进程就可以克隆父进程, ...

  8. 使用Nginx实现端口转发TCP代理

    需求产生背景 最近同事在测试和生产环境中分别部署了一套应用,由于应用只能集成LDAP,而我们公司使用的是AD,于是我搭建了一个OpenLDAP服务,账号先通过lsc从AD同步到OpenLDAP,然后使 ...

  9. 单个进程监听多个端口及多个进程监听同一个端口

    单个进程监听多个端口 单个进程创建多个 socket 绑定不同的端口,TCP, UDP 都行 多个进程监听同一个端口(multiple processes listen on same port) 方 ...

最新文章

  1. 跟小静读CLR via C#(02)-基元类型、引用类型、值类型
  2. mysql数据库导入到excel表格数据_[转载]将EXCEL表格中的数据导入mysql数据库表中(两种方法)...
  3. 网站发布问题及使用Web Deployment Projects
  4. Ubuntu下安装谷歌浏览器(Google chrome)报错
  5. 程序员搞笑故事:给女儿织的辫子 ​​​​,你知道是什么算法吗?
  6. 学习使用资源文件[2] - Ico
  7. C++std命名空间和头文件详解
  8. MIP 技术进展月报:储存功能全新上线,MIP-Cache域名升级,校验更严谨
  9. 数字图像处理(作业一)——matlab工具箱初探
  10. Unity Application Block 1.0系列文章
  11. mysql的槽_Mysql槽点 - MySQL及其它开源数据库 - ITPUB论坛-中国专业的IT技术社区...
  12. 应考虑字节顺序(大小端问题)的几种情况
  13. 「手把手带你学算法」本周小结!(动态规划系列七)
  14. linux中逻辑块大小为,Linux 文件系统相关的基本概念
  15. Vi 编辑器常用命令
  16. GNS3使用二:通过ASDM管理ASA防火墙
  17. Mac wifi 卡死
  18. 尚硅谷maven视频教程笔记
  19. 网络工程师学习必备!路由器的工作原理,你真的懂了吗?【超详细|深度解析】
  20. mMTC面临挑战与研究现状

热门文章

  1. Spring Boot异常
  2. Linux系统目录结构,文件类型以及ls、alias命令
  3. 爱上MVC~为DisplayNameFor添加扩展,支持PagedList集合
  4. centos平台cms系统
  5. 驳斥苹果“诊断后门论”,声援扎德尔斯基
  6. Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8
  7. Mathematica该注意的两种特殊的输入方式(blanksequence and ruledelayed)
  8. 如何下载github项目中的某一部分
  9. selenium代码练习
  10. Tomcat启动时为什么要配置CATALINA_HOME环境变量??