Nginx
约 2982 字大约 10 分钟
2025-02-27
它由俄罗斯程序员伊戈尔·赛索耶夫于2004年首次公开发布,并于2011年成立同名公司以提供支持服务。2019年3月11日,Nginx公司被F5网络公司以6.7亿美元收购。Nginx是一款免费的开源软件,根据类BSD许可证发布
Nginx简介
● Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。 ● 其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好 ● Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。 ● Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。
Nginx作用
反向代理
- 正向代理:代理的是客户端
正向代理是一个位于客户端和原始服务器之间的服务器,所有客户端的请求都首先发送到正向代理服务器,然后由代理服务器将请求转发到原始服务器。正向代理的目的是为了隐藏客户端的信息。 Nginx不是默认的正向代理服务器,但可以通过配置来实现正向代理的功能。 通常某些服务因为安全问题,限制固定访问,因此可以通过正向代理解决 访问某些国外的服务访问慢,可以通过正向代理中继缓解丢包和延迟高的问题
例如:VPN
http {
resolver 8.8.8.8;
server {
listen 8088;
location / {
proxy_pass http://$http_host$request_uri;
}
}
}
- 反向代理:代理的是服务端
反向代理,客户端对代理是无感知的,客户端不需要任何配置就可以访问,客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。 比如:百度的服务器是在不同的服务器上,我们只需要搜索baidu.com就行
upstream zyy {
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
proxy_pass http://zyy;
}
##....
}
负载均衡
Nginx可以实现负载均衡,可以将请求分发到多个服务器上,提高网站的并发处理能力。
如果请求数过大,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器的情况改为请求分发到多个服务器上,就是负载均衡。
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的
- 轮询:默认策略,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
- 加权轮询:根据服务器的响应时间来分配请求,响应时间短的优先分配。
- Ip hash:根据客户端的ip地址进行hash,相同ip地址的请求都分配到同一个服务器。
静态资源处理
Nginx可以作为静态资源服务器,直接响应请求,不用再经过PHP、Python等解释器,可以直接返回HTML、CSS、JavaScript等静态文件,提高访问速度。
我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。
Nginx安装
下载安装包
Nginx的安装包可以在官网下载,下载地址:Nginx 下载地址
安装
windows 版安装
解压:将下载完安装包后,解压至任意非中文路径下
运行:进入解压后的目录,直接双击nginx.exe 即可(一闪而过),或者进入cmd 输入nginx.exe
nginx.exe
验证: 在浏览器中输入http://localhost:80,出现欢迎页面即安装成功。 配置: Nginx的配置文件为nginx.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
}
...
当我们修改了nginx的配置文件nginx.conf 时,不需要关闭nginx后重新启动nginx,只需要执行命令 nginx -s reload 即可让改动生效
nginx -s reload
关闭nginx: 如果使用cmd命令窗口启动nginx, 关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx进程:
- 输入nginx命令 nginx -s stop(快速停止nginx) 或 nginx -s quit(完整有序的停止nginx)
nginx -s stop
nginx -s quit
- 使用taskkill命令强制结束nginx进程
taskkill /f /im nginx.exe
taskkill是用来终止进程的, /f是强制终止 . /t终止指定的进程和任何由此启动的子进程。 /im示指定的进程名称 .
Linux 版安装
装gcc(已经安装的可以忽略这个步骤)安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装
PCRE pcre-devel安装(已经安装的可以忽略这个步骤)PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库
zlib安装(已经安装的可以忽略这个步骤)zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库
openssl安装(已经安装的可以忽略这个步骤)OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库
- 安装依赖
yum install -y gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel
- 下载安装包
wget http://nginx.org/download/nginx-1.16.1.tar.gz
或者下载离线安装包,将安装包上传至服务器,然后解压安装包
tar -zxvf nginx-1.26.0.tar.gz
- 编译安装
cd nginx-1.26.0
./configure
make
make install
查看安装路径
whereis nginx
- 启动nginx
/usr/local/nginx/sbin/nginx
- 常用命令
# cd /usr/local/nginx/sbin/
# ./nginx //启动
# ./nginx -s stop //停止
# ./nginx -s quit //安全退出
# ./nginx -s reload //重新加载配置文件
# ps aux|grep nginx //查看nginx进程
- 开放端口
# 开发端口命令
firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 重新加载
firewall-cmd --reload
# 查看已开放的端口
firewall-cmd --zone=public --list-ports
- 验证 在浏览器输入 http://ip:80 或者 http://域名 即可访问
Nginx配置
- 精简配置(22行)
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
- 详细解释
#工作进程数量
worker_processes 1;
# 事件区块开始
events {
#单个进程最大连接数(最大连接数=连接数*进程数)
#根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
worker_connections 1024;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#include:导入外部文件mime.types,将所有types提取为文件,然后导入到nginx配置文件中
include mime.types;
#默认文件类型
default_type application/octet-stream;
#开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
#sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
sendfile on;
#长连接超时时间,单位是秒
keepalive_timeout 65;
# 第一个Server区块开始,表示一个独立的虚拟主机站点
server {
# 提供服务的端口,默认80
listen 80;
# 提供服务的域名主机名
server_name localhost;
#对 "/" 启用反向代理,第一个location区块开始
location / {
root html; #服务默认启动目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
}
# 错误页面路由
error_page 500 502 503 504 /50x.html; # 出现对应的http状态码时,使用50x.html回应客户
location = /50x.html { # location区块开始,访问50x.html
root html; # 指定对应的站点目录为html
}
}
}
实战案例
1. 静态资源服务器
Nginx作为静态资源服务器,可以直接响应请求,不用再经过PHP、Python等解释器,可以直接返回HTML、CSS、JavaScript等静态文件,提高访问速度。
- 准备工作
将静态资源文件上传至服务器,如:将html、css、js文件上传至/usr/share/nginx/html目录下
- 配置Nginx
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html; #指定静态资源文件目录
index index.html index.htm; # 默认的首页文件,多个用空格分开
}
}
- 验证
在浏览器输入 http://ip:80 或者 http://域名 即可访问
2. 反向代理(负载均衡)
- 将现有某个项目打包
- 运行jar项目 打开window命令窗口,启动服务
java -jar SpringBoot-Redis-1.0-SNAPSHOT.jar
再打开另一个窗口,启动一个8081的服务
java -jar SpringBoot-Redis-1.0-SNAPSHOT.jar --server.port=8081
- 启动nginx服务
- 修改nginx配置
upstream backend {
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://backend;
}
##....
}
- 验证
Nginx与网关的区别
在具体架构设计时Nginx做负载均衡时,考虑到API网关在系统中不止一个(以集群的方式做高可用),通常可以将Nginx至于API网关前,负责对API网关的负载均衡,然后再由网关决定进入根据判定到哪个真实的web 服务器。 让两者的分工更加明确,也就是:API网关聚合服务,Nginx请求转发