Nginx教程
Nginx简介
什么是nginx
Nginx 是一个高性能的HTTP和反向代理服务器。
特点是占用内存少,并发能力强,理论上能支持高达50000个并发连接数。
可以做什么
作为Web服务器
Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,如perl,php等。但是不支持java, java需要通过tomcat配合。
正向代理
Nginx可以作为正向代理来进行上网功能。
正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet, 则需要通过代理服务器来访问,这种代理服务器就称为正向代理。
正向代理需要客户端配置代理服务器进行指定网站访问。
反向代理
Nginx可以作为反向代理服务器。
反向代理中,客户端对代理是无感知的。因为客户端不需要任何配置就可以访问。请求发送到反向代理服务器后,由反向代理服务器去选择目标服务器,获取数据后返回给客户端。
反向代理服务器和真实服务器对外就是一台服务器,暴露的是代理服务器的地址,隐藏了真实服务器的地址。
负载均衡
增加服务器的数量,将请求分发到各个服务器上,将原来请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器上,也就是我们所说的负载均衡。
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。
Nginx安装
本次安装在虚拟机CentOS 7.6 64位系统中进行。
前置环境
先安装gcc环境,perl库,zlib,openssl等
#nginx编译依赖gcc环境
yum install -y gcc-c++
#pcre:(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式
yum install -y pcre pcre-devel
#该库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip
yum install -y zlib zlib-devel
#一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。nginx不仅支持http协议,还支持https(即在ssl协议上传输http)
yum install -y openssl openssl-devel
下载nginx本体
下载nginx-1.16.1.tar.gz,上传到服务器中/usr/local目录下
解压并进入源码目录
tar -zxf nginx-1.16.1.tar.gz
cd nginx-1.16.1
编译
./configure
make
make install
启动
cd /usr/local/nginx/sbin
./nginx
本地访问
从虚拟机外访问
由于Linux防火墙默认不允许访问80端口,所以我们用虚拟机外的windows系统是访问不了的。需要另外配置一下防火墙。
这里先介绍几个关于防火墙的命令
- 查看防火墙状态
firewall-cmd --state
- 查看开放的端口号
firewall-cmd --list-all
- 开放端口号
firewall-cmd --add-port=80/tcp --permanent
- 关闭端口号
firewall-cmd --remove-port=80/tcp --permanent
- 重启防火墙
firewall-cmd --reload
我们可以用上面的命令开放80端口,然后重启防火墙,之后就可以从linux系统外访问了。
Nginx常用命令和配置文件
常用命令
进入到/usr/local/nginx/sbin目录下执行
- 查看nginx版本号
./nginx -v
- 启动nginx
./nginx
- 停止nginx
./nginx -s stop
- 重新加载配置文件
./nginx -s reload
配置文件
配置文件默认在/usr/local/nginx/conf目录下,主要是nginx.conf。后续对nginx的使用基本都是对此配置文件的修改。
配置文件内容大致分为三个部分
1 全局块
从文件开始到events块之间的内容,主要是设置一些nginx服务器整体参数。包括运行nginx服务器的用户(组),允许生成的worker process数,进程PID存放路径,日志存放路径和类型,配置文件的引入等。
比如
worker_processes 1;
这是并发处理服务的关键配置,值越大,可支持的并发处理量越多,会受到软硬件制约。
2 events块
主要涉及nginx服务器与用户的网络连接。包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个work process可以同时支持的最大连接数等。
比如
events {
worker_connections 1024;
}
表示每个work process支持的最大连接数为1024
3 http块
这是nginx服务器配置中最频繁的部分,代理、缓存、日志等大多数功能和第三方模块的配置都在这里。
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;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
http块可以分为http全局块和server块
3.1 http全局块
http全局块配置包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
3.2 server块
这里和虚拟主机有关。从用户角度看,虚拟主机和一台独立的硬件主机是一样的。该技术是为了节约互联网服务器硬件成本。
每个http块包括多个server块,每个server块就相当于一个虚拟主机。
每个server块又分为其全局server块和配置多个location块
3.2.1 全局server块
主要是配置本虚拟主机的监听信息、虚拟主机的名称、IP
3.2.2 location块
一个server块可以配置多个location块
这里的主要作用是基于nginx服务器收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(或IP别名)之外的字符串(如/uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存、应答控制等功能,许多第三方模块也在这里配置。
Nginx配置实例
反向代理
实例一
1 在linux中安装tomcat,解压并进入tomcat bin目录, ./start.sh启动tomcat服务器
2 由于tomcat默认端口8080,需要防火墙开放此端口
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
到这里应该能在windows中通过ip:端口访问linux中的tomcat服务器
3 修改nginx配置文件,进行转发配置
server {
listen 80;
server_name 192.168.17.129;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
4 修改windows系统的hosts文件,进行域名和ip的对应关系配置
192.168.17.129 www.123.com
5 最终效果
在windows系统浏览器输入www.123.com,访问到linux中的tomcat服务器
实例二
1 准备两个tomcat,一个8080端口,一个8081端口。
在8080tomcat的webapps目录下创建edu目录,在edu目录下新建a.html页面,该页面打印"8080!!";
在8081tomcat的webapps目录下创建vod目录,在vod目录下新建a.html页面,该页面打印"8081!!"。
2 nginx反向代理配置
server {
listen 9001;
server_name 192.168.17.129;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}
location指令说明
该指令用于匹配URL,语法如下
location [ = | ~ | ~* | ^~] uri {
}
- =: 用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
- ~: 用于表示uri包含正则表达式,并且区分大小写。
- ~*:用于表示ri包含正则表达式,并且不区分大小写。
- ^~: 用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
注意: 如果uri包含正则表达式,则必须要有或者*标识。
3 对外开放 8080 8081 9001 端口
4 最终效果
访问 http://192.168.17.129:9001/edu/a.html 跳转到 127.0.0.1:8080/edu/a.html
访问 http://192.168.17.129:9001/vod/a.html 跳转到 127.0.0.1:8081/vod/a.html
负载均衡
1 准备两台tomcat,一个8080端口,一个8081端口。
在两台tomcat中webapps目录下创建edu文件夹,在edu文件夹下创建a.html页面,内容不同便于测试
2 在nginx.conf进行配置
upstream myserver {
server 192.168.17.129:8080;
server 192.168.17.129:8081;
}
server {
listen 80;
server_name 192.168.17.129;
location / {
proxy_pass http://myserver;
}
}
nginx负载均衡策略
- 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 - weight
weight代表权重,默认为1.权重越高被分配的次数越多。
weight和访问比率成正比,用于后端服务器性能不均的情况,如
upstream myserver {
server 192.168.17.129:8081 weight=10;
server 192.168.17.129:8082 weight=5;
}
- ip_hash
每个请求按访问ip的hash结果分配,这样每个访客访问固定的后端服务器,可以解决session的问题。如
upstream myserver {
ip_hash;
server 192.168.17.129:8081;
server 192.168.17.129:8082;
}
- fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。如
upstream myserver {
server 192.168.17.129:8081;
server 192.168.17.129:8082;
fair;
}
3 最终效果
浏览器中访问http://192.168.17.129/edu/a.html,访问会平均到8080端口和8081端口中。
动静分离
动静分离简单来说就是把动态请求和静态请求分开。静态资源和动态资源不同服务器处理。
Nginx通过location指定不同的后缀名实现不同的请求转发。
1 在linux系统中准备静态资源。
image目录下放一个01.jpg图片,www目录下放一个a.html文件。
2 在nginx配置文件中配置location
server {
listen 80;
server_name 192.168.17.129;
location /www/ {
root /data/;
}
location /image/ {
root /data/;
autoindex on;
}
}
3 最终效果
浏览器中访问http://192.168.17.129/image/01.jpg
由于配置了autoindex on,我们可以查看image目录
浏览器中访问http://192.168.17.129/www/a.html
高可用
架构图
1 准备工作
准备两个linux,nginx,keepalived。
2 安装软件
假设两个linux的ip分别为 192.168.17.129 和 192.168.17.131
在两个linux上安装nginx
在两个linux上安装keepalived
yum install keepalived -y
3 配置keepalived.conf
修改两个/etc/keepalived/keepalived.conf,主备的keepalived配置主要是state和priority属性不同。
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 //网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小(如90)
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50 // VRRP H 虚拟地址
}
}
在/usr/local/src下添加检测脚本
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
4 启动软件
分别启动两个linux的nginx和keepalived
启动nginx
./nginx
启动keepalived
systemctl start keepalived.service
5 最终效果
在浏览器中访问虚拟ip地址 192.168.17.50
把主服务器(192.168.17.129)的nginx和keepalived停止,再访问 192.168.17.50
Nginx原理
master和worker
worker如何工作
master-workers的好处
- 每个worker进程都是独立的,不需要加锁,节省了锁的开销。在编程及查找问题时也会方便很多。
- 独立的进程间不会相互影响。一个进程退出后,其他进程还在工作,服务不会中断,master进程则很快启动新的worker进程。
- 当某个worker进程异常退出,会导致当前worker上所有请求失败,但是不会影响到所有请求,所以降低了风险。
- nginx -s reload热部署也得益于多个worker进程。
配置文件优化
设置worker_processes
Nginx同redis类似采用了io多路复用机制。每个worker都是独立的进程,每个进程里只有一个主线程,通过异步非阻塞的方式处理请求,可以处理成千上万的请求。
每个worker的线程可以把一个cpu的性能发挥到极致,故worker数和服务器的cpu数相等是最为适宜的。设置少了会浪费cpu,多了会造成cpu频繁切换上下文的消耗。
设置worker
worker_processes 4
#worker绑定cpu(4 worker 绑定 4 cpu)
worker_cpu_affinity 0001 0010 0100 1000
这里说明一下:Nginx默认未开启多核,配置worker_cpu_affinity参数来充分利用多核cpu。
- 假设2 cpu,开启2进程
worker_processes 2;
worker_cpu_affinity 01 10;
- 假设4 cpu,开启4进程
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
- 假设8 cpu,开启8进程
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
总之,有多少核数总位数就有多少个,从右往左,1表示开启对应cpu核。
设置worker_connections
worker_connections表示每个worker进程能建立的最大连接数。
一个nginx的最大连接数是worker_processes * worker_connections。
但最大并发数不是最大连接数。由于每次请求占用两个连接,所以普通的静态访问最大并发数是最大连接数的一半,即worker_processes * worker_connections / 2;如果作为反向代理,每个并发需要建立与客户端的连接和与后端服务器(如tomcat)的连接,那么最大并发数还要再减半,即worker_processes * worker_connections / 4。