共计 7807 个字符,预计需要花费 20 分钟才能阅读完成。
NGINX 联结创始人安德鲁·阿列克谢夫(Andrew Alexeev)曾说:NGINX 是为对 Apache 性能不称心的人而构建的。随着 Internet 需要的变动,Web 服务器的工作也在变动。NGINX 的构建比以往任何时候都更有效率,更可扩大,更平安,更弱小。
本文提供了 Nginx 的基本概念及常识。以开发者必备的 Nginx 基础知识为主,列举了一些 Nginx 教程,心愿对大家有所帮忙。
一. 环境
服务器版本:CentOS 7.2
为了保障学习阶段不遇到奇怪的事件,请保障以下四点:
- 确认零碎网络
- 确认 yum 可用
- 确认敞开 iptables
- 确认停用 selinux
# 查看 iptables 状态
systemctl status firewalld.service
#敞开防火墙(长期敞开)systemctl stop firewalld.service
#查看 SELinux 状态
getenforce# 长期敞开 SELinux
setenforce 0
装置一些零碎根本工具,失常状况零碎都会自带
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
yum -y install wget httpd-tools vim
二. 基本概念
2.1Nginx 是什么?
Nginx
是一个高性能的 http
和反向代理服务器,其特点是占用内存小,并发能力强。Nginx
专为性能优化而开发,性能是其最重要的考量,能禁受高负载的考验,有报告表明能反对高达 50000 个并发连接数。
2.2 正向代理与反向代理
为了便于了解,首先先来理解一下一些基础知识,nginx 是一个高性能的反向代理服务器那么什么是反向代理呢?
代理是在服务器和客户端之间假如的一层服务器,代理将接管客户端的申请并将它转发给服务器,而后将服务端的响应转发给客户端。
不论是正向代理还是反向代理,实现的都是下面的性能。如果你对 OSI 七层模型与 TCP/IP 四层模型不是很相熟能够再回顾下。
正向代理
正向代理(forward)意思是一个位于客户端和原始服务器 (origin server) 之间的服务器,为了从原始服务器获得内容,客户端向代理发送一个申请并指定指标 (原始服务器),而后代理向原始服务器转交申请并将取得的内容返回给客户端。
正向代理是为咱们服务的,即为客户端服务的,客户端能够依据正向代理拜访到它自身无法访问到的服务器资源。
正向代理对咱们是通明的,对服务端是非通明的,即服务端并不知道本人收到的是来自代理的拜访还是来自实在客户端的拜访。
反向代理
反向代理(Reverse Proxy)形式是指以代理服务器来承受 internet 上的连贯申请,而后将申请转发给外部网络上的服务器,并将从服务器上失去的后果返回给 internet 上申请连贯的客户端,此时代理服务器对外就体现为一个反向代理服务器。
反向代理是为服务端服务的,反向代理能够帮忙服务器接管来自客户端的申请,帮忙服务器做申请转发,负载平衡等。
反向代理对服务端是通明的,对咱们是非通明的,即咱们并不知道本人拜访的是代理服务器,而服务器晓得反向代理在为他服务。
2.3 负载平衡
如果申请数过大,单个服务器解决不了,咱们减少服务器的数量,而后将申请散发到各个服务器上,将原先申请集中到单个服务器的状况改为申请散发到多个服务器上,就是负载平衡。
Upstream 指定后端服务器地址列表,在 server 中拦挡响应申请,并将申请转发到 Upstream 中配置的服务器列表。
`upstream balanceServer {
server 10.1.22.33:12345;
server 10.1.22.34:12345;
server 10.1.22.35:12345;
}
server {
server_name fe.server.com;
listen 80;
location /api {
proxy_pass http://balanceServer;
}
}`
下面的配置只是指定了 nginx 须要转发的服务端列表,并没有指定调配策略。
默认状况下采纳的是轮询策略,将所有客户端申请轮询调配给服务端。这种策略是能够失常工作的,然而如果其中某一台服务器压力太大,呈现提早,会影响所有调配在这台服务器下的用户。
Nginx 反对的负载平衡调度算法形式如下:
weight 轮询(默认,罕用):接管到的申请依照权重调配到不同的后端服务器,即便在应用过程中,某一台后端服务器宕机,Nginx 会主动将该服务器剔除出队列,申请受理状况不会受到任何影响。这种形式下,能够给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上申请的分配率;权重数据越大,被调配到申请的几率越大;该权重值,次要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。ip_hash(罕用):每个申请依照发动客户端的 ip 的 hash 后果进行匹配,这样的算法下一个固定 ip 地址的客户端总会拜访到同一个后端服务器,这也在肯定水平上解决了集群部署环境下 session 共享的问题。
fair:智能调整调度算法,动静的依据后端服务器的申请解决到响应的工夫进行平衡调配,响应工夫短解决效率高的服务器调配到申请的概率高,响应工夫长解决效率低的服务器调配到的申请少;联合了前两者的长处的一种调度算法。然而须要留神的是 Nginx 默认不反对 fair 算法,如果要应用这种调度算法,请装置 upstream_fair 模块。url_hash:依照拜访的 url 的 hash 后果调配申请,每个申请的 url 会指向后端固定的某个服务器,能够在 Nginx 作为动态服务器的状况下进步缓存效率。同样要留神 Nginx 默认不反对这种调度算法,要应用的话须要装置 Nginx 的 hash 软件包。
2.4 动静拆散
为了放慢服务器的解析速度,能够把动静页面和动态页面交给不同的服务器来解析,放慢解析速度,升高原来单个服务器的压力。
2.5Nginx 常用命令
# 疾速敞开 Nginx,可能不保留相干信息,并迅速终止 web 服务
nginx -s stop
# 安稳敞开 Nginx,保留相干信息,有安顿的完结 web 服务
nginx -s quit
# 因扭转了 Nginx 相干配置,须要从新加载配置而重载
nginx -s reload
# 从新关上日志文件
nginx -s reopen
# 为 Nginx 指定一个配置文件,来代替缺省的
nginx -c filename
# 不运行,而仅仅测试配置文件。nginx 将查看配置文件的语法的正确性,并尝试关上配置文件中所援用到的文件
nginx -t
# 显示 nginx 的版本
nginx -v
# 显示 nginx 的版本,编译器版本和配置参数
nginx -V
# 格局换显示 nginx 配置参数
2>&1 nginx -V | xargs -n1
2>&1 nginx -V | xargs -n1 | grep lua
三. 为什么抉择Nginx?
Nginx 是一款自在的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器;Nginx 能够作为一个 HTTP 服务器进行网站的公布解决,另外 Nginx 能够作为反向代理进行负载平衡的实现。在 Nginx 网站上,其性能包含:
- HTTP 和 HTTPS(TLS / SSL / SNI)
- 超疾速的 Web 服务器用于动态内容
- FastCGI,WSGI,SCGI 用于动静内容
- 具备负载平衡和缓存性能的减速 Web 代理
- 不间断实时二进制降级和配置
- 压缩和内容过滤器
- 虚拟主机
- FLV 和 MP4 的媒体流
- 带宽和连贯策略
- 全面的访问控制
- 自定义日志
- 嵌入式脚本
- 带有 TLS 的 SMTP / IMAP / POP3 的邮件代理
- 逻辑,灵便,可扩大的配置
- 在 Linux,FreeBSD,Mac OS X,Solaris 和 Windows 上运行
nginx 有如下劣势:
1. IO 多路复用 epoll(IO 复用)
如何了解呢?举个例子吧!
有 A、B、C 三个老师,他们都遇到一个难题,要帮忙一个班级的学生解决课堂作业。
老师 A 采纳从第一排开始一个学生一个学生轮流解答的形式去答复问题,老师 A 节约了很多工夫,并且有的学生作业还没有实现呢,老师就来了,反反复复效率极慢。
老师 B 是一个忍者,他发现老师 A 的办法行不通,于是他应用了影分身术,分身出好几个本人同一时间去帮好几个同学答复问题,最初还没答复完,老师 B 耗费光了能量累倒了。
老师 C 比拟精明,他通知学生,谁实现了作业举手,有举手的同学他才去领导问题,他让学生被动发声,离开了“并发”。
这个老师 C 就是 Nginx。
2. 轻量级
- 功能模块少 – Nginx 仅保留了 HTTP 须要的模块,其余都用插件的形式,先天增加
- 代码模块化 – 更适宜二次开发,如阿里巴巴 Tengine
3. CPU 亲和
把 CPU 外围和 Nginx 工作过程绑定,把每个 worker 过程固定在一个 CPU 上执行,缩小切换 CPU 的 cache miss,从而进步性能。
四.Nginx 的装置
1. 本地装置
- windows 零碎:
间接去官网:https://nginx.org/en/download… 下载相应版本即可。
- mac 零碎:
$ brew install nginx
2.Linux 装置:
以 centOS 零碎为例,有上面两种装置形式(举荐 1)
1.) 通过 rpm 镜像源装置
$ rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ yum install -y nginx
2.) 通过依赖包具体装置
装置 nginx 依赖库 pcre、zlib
$ yum install pcre pcre-devel
$ yum install zlib zlib-devel
如有必要,能够装置 c ++ 编译环境和 openssl
$ yum install gcc-c++
$ yum install openssl openssl-devel
下载 / 编译 nginx
$ wget -c https://nginx.org/download/nginx-1.16.0.tar.gz
$ tar -zxvf nginx-1.16.0.tar.gz
# 编译装置
$ cd nginx-1.16.0
$ ./configure # 默认装置在 /usr/local/nginx
$ make && make install
# 创立软链
$ ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
$ nginx -v
五.Nginx 配置
# 关上主配置文件,若你是用 lnmp 环境装置
vim /usr/local/nginx/conf/nginx.conf
----------------------------------------
user #设置 nginx 服务的零碎应用用户
worker_processes #工作过程数 个别状况与 CPU 核数保持一致
error_log #nginx 的谬误日志
pid #nginx 启动时的 pid
events {
worker_connections #每个过程容许最大连接数
use #nginx 应用的内核模型
}
咱们应用 nginx 的 http 服务,在配置文件 nginx.conf 中的 http 区域内,配置无数个 server,每一个 server 对应这一个虚拟主机或者域名。
http {
... ... #前面再具体介绍 http 配置我的项目
server {
listen 80 #监听端口;
server_name localhost #地址
location / { #拜访首页门路
root /xxx/xxx/index.html #默认目录
index index.html index.htm #默认文件
}
error_page 500 504 /50x.html #当呈现以上状态码时从新定义到 50x.html
location = /50x.html { #当拜访 50x.html 时
root /xxx/xxx/html #50x.html 页面所在位置
}
}
server {... ...}
}
一个 server 能够呈现多个 location,咱们对不同的拜访门路进行不同状况的配置
咱们再来看看 http 的配置详情。
http {
sendfile on #高效传输文件的模式 肯定要开启
keepalive_timeout 65 #客户端服务端申请超时工夫
log_format main XXX #定义日志格局 代号为 main
access_log /usr/local/access.log main #日志保留地址 格局代码 main
}
上面是 nginx 一些配置中罕用的内置全局变量,你能够在配置的任何地位应用它们。
六.Nginx 实战
各种开发工具的配置联合实战来讲述,会让人更易了解。
咱们先实现一个小指标:不思考简单的配置,仅仅是实现一个 http 反向代理。
nginx.conf 配置文件如下:
注:_
conf/nginx.conf
是 nginx 的默认配置文件。你也能够应用 nginx -c 指定你的配置文件_
# 运行用户
#user somebody;
#启动过程, 通常设置成和 cpu 的数量相等
worker_processes 1;
#全局谬误日志
error_log D:/Tools/nginx-1.10.1/logs/error.log;
error_log D:/Tools/nginx-1.10.1/logs/notice.log notice;
error_log D:/Tools/nginx-1.10.1/logs/info.log info;
#PID 文件,记录以后启动的 nginx 的过程 ID
pid D:/Tools/nginx-1.10.1/logs/nginx.pid;
#工作模式及连接数下限
events {worker_connections 1024; #单个后盾 worker process 过程的最大并发链接数}
#设定 http 服务器,利用它的反向代理性能提供负载平衡反对
http {#设定 mime 类型(邮件反对类型), 类型由 mime.types 文件定义
include D:/Tools/nginx-1.10.1/conf/mime.types;
default_type application/octet-stream;
#设定日志
log_format main '[$remote_addr] - [$remote_user] [$time_local]"$request"''$status $body_bytes_sent "$http_referer" ''"$http_user_agent""$http_x_forwarded_for"';
access_log D:/Tools/nginx-1.10.1/logs/access.log main;
rewrite_log on;
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 形式)来输入文件,对于一般利用,#必须设为 on, 如果用来进行下载等利用磁盘 IO 重负载利用,可设置为 off,以均衡磁盘与网络 I / O 处理速度,升高零碎的 uptime.
sendfile on;
#tcp_nopush on;
#连贯超时工夫
keepalive_timeout 120;
tcp_nodelay on;
#gzip 压缩开关
#gzip on;
#设定理论的服务器列表
upstream zp_server1{server 127.0.0.1:8089;}
#HTTP 服务器
server {
#监听 80 端口,80 端口是出名端口号,用于 HTTP 协定
listen 80;
#定义应用 www.xx.com 拜访
server_name www.helloworld.com;
#首页
index index.html
#指向 webapp 的目录
root D:01_WorkspaceProjectgithubzpSpringNotesspring-securityspring-shirosrcmainwebapp;
#编码格局
charset utf-8;
#代理配置参数
proxy_connect_timeout 180;
proxy_send_timeout 180;
proxy_read_timeout 180;
proxy_set_header Host $host;
proxy_set_header X-Forwarder-For $remote_addr;
#反向代理的门路(和 upstream 绑定),location 前面设置映射的门路
location / {proxy_pass http://zp_server1;}
#动态文件,nginx 本人解决
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
root D:01_WorkspaceProjectgithubzpSpringNotesspring-securityspring-shirosrcmainwebappviews;
#过期 30 天,动态文件不怎么更新,过期能够设大一点,如果频繁更新,则能够设置得小一点。expires 30d;
}
#设定查看 Nginx 状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
#禁止拜访 .htxxx 文件
location ~ /.ht {deny all;}
#错误处理页面(可选择性配置)#error_page 404 /404.html;
#error_page 500 502 503 504 /50x.html;
#location = /50x.html {
# root html;
#}
}
}
好了,让咱们来试试吧:
- 启动 webapp,留神启动绑定的端口要和 nginx 中的 upstream 设置的端口保持一致。
- 更改 host:在 C:WindowsSystem32driversetc 目录下的 host 文件中增加一条 DNS 记录
127.0.0.1 www.helloworld.com
- 启动前文中 startup.bat 的命令
- 在浏览器中拜访 www.helloworld.com,不出意外,曾经能够拜访了。
搭建文件服务器
有时候,团队须要归档一些数据或材料,那么文件服务器必不可少。应用 Nginx 能够十分疾速便捷的搭建一个繁难的文件服务。
Nginx 中的配置要点:
- 将 autoindex 开启能够显示目录,默认不开启。
- 将 autoindex_exact_size 开启能够显示文件的大小。
- 将 autoindex_localtime 开启能够显示文件的批改工夫。
- root 用来设置凋谢为文件服务的根门路。
- charset 设置为 charset utf-8,gbk;,能够防止中文乱码问题
一个最简化的配置如下:
autoindex on;# 显示目录
autoindex_exact_size on;# 显示文件大小
autoindex_localtime on;# 显示文件工夫
server {
charset utf-8,gbk; # windows 服务器下设置后,仍然乱码,临时无解
listen 9050 default_server;
listen [::]:9050 default_server;
server_name _;
root /share/fs;
}
** 七. 总结
以上内容只是 nginx 的冰山一角,做为一个 nginx 入门,到这里就根本完结了。心愿对大家有所帮忙。