Nginx学习总结
Posted AC_Jobim
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx学习总结相关的知识,希望对你有一定的参考价值。
nginx学习总结
一、Nginx介绍
- Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数。其特点是占有内存少,并发能力强。
Nginx 作为 web 服务器
- Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php 等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发, 性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高 达 50,000 个并发连接数。
正向代理
- Nginx 不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
反向代理
- 反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问。
- 我们只 需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器 地址,隐藏了真实服务器 IP 地址。
负载均衡
- 增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的 情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
- 客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
- 当访问量很大时,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
动静分离
- 为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
//一键安装上面四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
二、nginx安装
安装nginx前需要确保linux上安装了gcc
、PCRE
、zlib
、OpenSSL
- 安装 nginx 需要先将官网下载的源码进行编译,编译依赖
gcc
环境。 PCRE
(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:zlib
库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。OpenSSL
是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库。
1、安装依赖包
-
方法一:
- 安装
openssl
、zlib
、gcc
依赖yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
- 安装pcre
解压文件, 进入
pcre
目录
执行configure
文件
执行命令:make && make install
pcre安装成功,查看版本
- 安装
-
方法二:(推荐)
//一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
2、安装nginx
- 解压文件
- 使用
./configure
执行configure 文件
- 执行命令:
make && make install
3、运行nginx
安装完nginx后,会在 路径/usr/local
下自动生成 nginx 文件夹。这是自动生成的
进入sbin
目录通过./nginx
命令启动nginx服务
4、防火墙问题
-
在 windows 系统中访问 linux 中 nginx,默认不能访问的,因为防火墙问题
-
解决办法:1)关闭防火墙 (2)开放访问的端口号,80 端口
开放端口相关命令:
# 开启防火墙
service firewalld start
# 重启防火墙
service firewalld restart
# 关闭防火墙
service firewalld stop
# 查看防火墙规则
firewall-cmd --list-all
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
开放80端口,并重启防火墙:
输入服务器ip:80
,显示
三、nignx的常用命令和配置文件
3.1 常用命令
执行命令的前提条件,必须进入nginx下的/sbin
的目录中
cd /usr/local/nginx/sbin
-
查看 nginx 的版本号
./nginx -v
-
启动 nginx
./nginx
-
关闭nginx
./nginx -s stop
-
重新加载 nginx
./nginx -s reload
3.2 配置文件
1、nginx 配置文件位置
cd /usr/local/nginx/conf/nginx.conf
精简之后的内容为:
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;
}
}
}
nginx 配置文件可分为三部分:
第一部分:全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID存放路径、日志存放路径和类型以及配置文件的引入等。
比如 worker_processes 1;
处理并发数的配置
第二部分:events块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否 允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数
等。
events {
worker_connections 1024;
}
比如 worker_connections 1024;
支持的最大连接数为 1024
第三部分:http块
http块又包括 http全局块、server 块。
-
http全局块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
-
server 块
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。- 全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。 - location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。 地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
- 全局 server 块
四、Nginx 反向代理
4.1 准备工作,安装tomcat
-
tomcat 安装文件放到 liunx 系统中,解压
-
对外开放访问的端口
firewall-cmd --add-port=8080/tcp --permanent # 开放8080端口 firewall-cmd –reload
-
开启tomcat,在bin目录下,使用 命令:
./startup.sh
4.2 配置实例一
实现效果: 打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到 liunx 系统 tomcat 主页 面中
- 访问过程的分析:
-
在 windows 系统的 host 文件进行域名和 ip 对应关系的配置
在host文件中添加下面内容:
-
在nginx进行请求转发的配置(反向代理配置)
-
访问域名为 www.123.com,结果:
4.3 配置实例二
实现效果:
使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中,nginx 监听端口为 9001
访问 http://192.168.2.4:9001/edu/ 直接跳转到 127.0.0.1:8080
访问 http:// 192.168.2.4:9001/vod/ 直接跳转到 127.0.0.1:8081
-
准备两个tomcat服务器(一个8080端口,一个8081端口)和测试页面
-
在
/usr/src
目录下新建tomcat8080和tomcat8081两个文件夹,用来存放两个tomcat
-
准备测试页面,写一个a.html页面
tomcat8080的tomcat,放到目录
/webapp/vod
下,内容:<h1>8080!!!</h1>
tomcat8081的tomcat,放到目录
/webapp/edu
下,内容:<h1>8081!!!</h1>
-
-
修改 nginx 的配置文件
在 http 块中添加 server{}
-
测试结果
**location 指令说明:**该指令用于匹配 URL
使用语法:
location [ = | ~ | ~* | ^~ ] uri {
}
=
:用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。~
:用于表示 uri 包含正则表达式,并且区分大小写。~*
:用于表示 uri 包含正则表达式,并且不区分大小写。^~
:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~*标识。
五、负载均衡
5.1 负载均衡配置实例
实现效果:
浏览器地址栏输入地址 http://192.168.2.4/edu/a.html,负载均衡效果,平均到两个tomcat服务器中(一个8080,一个8081)
- 准备两台 tomcat 服务器
在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建页面 a.html,用于测试。
8080tomcat =====>> a.html内容为8080!!!
8081tomcat =====>> a.html内容为8081!!!
- 在 nginx 的配置文件中进行负载均衡的配置
- 测试url
http://192.168.2.4/edu/a.html
5.2 nginx分配服务器策略
负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。而且 Nginx 提供了几种分配方式(策略):
1、轮询
(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2、weight
weight
代表权重, 默认为 1,权重越高被分配的客户端越多
upstream myserver {
server 208.208.128.122:8081 weight=10; # 指定权重
server 208.208.128.122:8082 weight=10;
}
server {
listen 80;
server_name 208.208.128.122;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
3、ip_hash
ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器
,可以解决session的问题
upstream myserver {
ip_hash; // 指定为ip_hash的方式
server 208.208.128.122:8081 ;
server 208.208.128.122:8082 ;
}
server {
listen 80;
server_name 208.208.128.122;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
4、fair
(第三方)
fair
(第三方),按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver {
server 208.208.128.122:8081 ;
server 208.208.128.122:8082 ;
fair; # 指定为fair方式
}
server {
listen 80;
server_name 208.208.128.122;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
六、Nginx动静分离配置实例
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:
- 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
- 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资 源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送 一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。
实现:通过nginx处理静态资源
-
在Linux 系统中准备 静态资源,用于进行访问。
www文件夹中 a.html<h1>test html!!!</h1>
-
在 nginx配置文件中进行配置
-
测试
-
在浏览器地址栏输入地址
http://192.168.2.4/www/a.html
-
浏览器中输入地址
http://192.168.2.4/image/01.jpg
·3. 在浏览器中输入地址http://192.168.2.4/image/
,列出了文件的目录
-
七、Nginx的高可用集群
为了防止当Nginx代理服务器挂掉了后面的服务就都没有办法访问了。所有就引出了高可用集群。下面的实例将配置一主一从的高可用集群。
-
配置高可用的准备工作
-
需要两台服务器 192.168.2.4 和 120.53.17.250,并在两台服务器安装 nginx
-
在台服务器安装
keepalived
使用yum命令进行安装
yum install keepalived -y # 查看版本: rpm -q -a keepalived
安装之后,在 etc 里面生成目录 keepalived,有文件keepalived.conf
-
-
配置文件(两台服务器都得改)
-
修改
/etc/keepalived/keepalivec.conf
配置文件,主从模式主要在这个文件里配置。global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.2.4 smtp_connect_timeout 30 # 通过它,可以访问到主机,在hosts文件中,要做映射关系,类似于 127.0.0.1 LVS_DEVEL 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 BACKUP # 备份服务器上将 MASTER 改为 BACKUP interface docker0 # 绑定的网卡 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 # 每隔一秒发送一次心跳,确保从服务器是否还活着 authentication { auth_type PASS # 心跳检测需要的密码 auth_pass 1111 } virtual_ipaddress { 192.168.2.50 // VRRP H 虚拟地址 } }
-
在
/usr/local/src
添加检测脚本nginx_check.sh
#!/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
-
-
把两台服务器上 nginx 和 keepalived 启动
- 启动 nginx:
./nginx
- 启动 keepalived:
systemctl start keepalived.service
- 启动 nginx:
-
测试
- 在浏览器地址栏输入 虚拟 ip 地址
192.168.17.50
- 把主服务器(192.168.2.4)nginx 和 keepalived 停止,再输入
192.168.17.50
结果:关闭之后仍然可以访问
- 在浏览器地址栏输入 虚拟 ip 地址
八、Nginx执行原理
1、mater 和 worker
Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程
过来的请求由master管理,worker进行争抢式的方式去获取请求。
2、master-workers 的机制的好处
- 首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销, 同时在编程以及问题查找时,也会方便很多。
- 可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作
- 其次,采用独立的进程,可以让互相之间不会 影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当 前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
3、设置多少个 worker
Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进 程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话 下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的。
4、连接数 worker_connection
这个值是表示每个worker进程所能建立连接的最大值,所以一个nginx 能建立的最大连接数,应该是worker_connections * worker_processes
而所支持的最大并发数为:
- 普通的静态访问最大并发数是: worker_connections * worker_processes /2,
- 而如果是 HTTP 作为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。
注意:发送请求,占用了 woker 2个或者4个链接数(静态资源2个, HTTP 作为反向代理则为4个)
参考博客:nginx学习,看这一篇就够了
以上是关于Nginx学习总结的主要内容,如果未能解决你的问题,请参考以下文章
Nginx——Nginx启动报错Job for nginx.service failed because the control process exited with error code(代码片段