Nginx
简介
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
优点
1、可以高并发连接
官方测试Nginx能够支撑5万并发连接,实际生产环境中可以支撑2~4万并发连接数。
原因,主要是Nginx使用了最新的epoll(Linux2.6内核)和kqueue(freeBSD)网路I/O模型,而Apache使用的是传统的Select模型,其比较稳定的Prefork模式为多进程模式,需要经常派生子进程,所以消耗的CPU等服务器资源,要比Nginx高很多。2、内存消耗少
Nginx+PHP(FastCGI)服务器,在3万并发连接下,开启10个Nginx进程消耗150MB内存,15MB10=150MB,开启的64个PHP-CGI进程消耗1280内存,20MB64=1280MB,加上系统自身消耗的内存,总共消耗不到2GB的内存。 如果服务器的内存比较小,完全可以只开启25个PHP-CGI进程,这样PHP-CGI消耗的总内存数才500MB。
3、成本低廉
购买F5BIG-IP、NetScaler等硬件负载均衡交换机,需要十多万到几十万人民币,而Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费试用,并且可用于商业用途。
BSD开源协议是一个给使用者很大自由的协议,协议指出可以自由使用、修改源代码、也可以将修改后的代码作为开源或专用软件再发布。4、配置文件非常简单
网络和程序一样通俗易懂,即使,非专用系统管理员也能看懂。5、支持Rewrite重写
能够根据域名、URL的不同,将http请求分到不同的后端服务器群组。6、内置的健康检查功能
如果NginxProxy后端的某台Web服务器宕机了,不会影响前端的访问。7、节省带宽
支持GZIP压缩,可以添加浏览器本地缓存的Header头。8、稳定性高
用于反向代理,宕机的概率微乎其微。9、支持热部署
Nginx支持热部署,它的自动特别容易,并且,几乎可以7天*24小时不间断的运行,即使,运行数个月也不需要重新启动,还能够在不间断服务的情况下,对软件版本进行升级。
环境搭建
下载安装环境
pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。
yum install -y pcre pcre-devel
c.zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。
yum install -y zlib zlib-devel
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。
yum install -y openssl openssl-devel
安装编译插件
yum -y install gcc-c++
上传 nginx 到 linux 系统
上传路径为 /usr/local/
解压缩, 并进入解压文件夹
配置安装路径
源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(makeinstall)。
Configure是一个可执行脚本,它有很多选项,在待安装的源码路径下使用命令./configure–help输出详细的选项列表。
其中–prefix选项是配置安装的路径,如果不配置该选项,安装后可执行文件默认放在/usr/local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr/local/share,比较凌乱。
如果配置–prefix,如:
# ./configure --prefix=/usr/local/test
此处为
cd nginx-1.6.2
./configure --prefix=/usr/local/nginx
可以把所有资源文件放在/usr/local/test的路径中,不会杂乱。
用了—prefix选项的另一个好处是卸载软件或移植软件。当某个安装的软件不再需要时,只须简单的删除该安装目录,就可以把软件卸载得干干净净;移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统)。
当然要卸载程序,也可以在原来的make目录下用一次make uninstall,但前提是make文件指定过uninstall。
编译和安装
make && make install
安装成功
进入到安装目录
cd ..
cd nginx
ls
# 显示为四个目录 conf html logs sbin
其中 启动命令为 sbin 中的 nginx 命令
启动
/usr/local/nginx/sbin/nginx
没有报错 就说明 安装成功
# 使用 进程命令, 验证是否安装成功
ps -ef | grep nginx
开放80端口号, 外网可访问
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables restart
/etc/rc.d/init.d/iptables status
编辑防火墙文件
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 81 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 82 -j ACCEPT
输入网址 可以直接访问
关闭命令 (-s stop)
/usr/local/nginx/sbin/nginx -s stop
推荐使用 -s quit
此方式停止步骤是待nginx进程处理任务完毕进行停止。从容关闭
重启命令
/usr/local/nginx/sbin/nginx -s reload
虚拟主机配置
修改配置文件
启动 nginx 之后,
查看 安装目录
(发现生成了很多目录)
ls
client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
找到 conf 目录
cd conf
ls
fastcgi.conf fastcgi_params koi-utf mime.types nginx.conf
scgi_params uwsgi_params win-utf
fastcgi.conf.default fastcgi_params.default koi-win mime.types.default nginx.conf.default scgi_params.default uwsgi_params.default
核心配置文件为 (nginx.conf )
vim nginx.conf
nginx.conf配置文件
Nginx配置文件主要分成四部分:
main(全局设置) | main部分设置的指令将影响其它所有部分的设置; |
server(主机设置) | server部分的指令主要用于指定虚拟主机域名、IP和端口; |
upstream(上游服务器设置,主要为反向代理、负载均衡相关配置) | upstream的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡; |
location(URL匹配特定位置后的设置) | location部分用于匹配网页位置(比如,根目录“/”,“/images”,等等)。 |
他们之间的关系式:server继承main,location继承server;
upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。
server虚拟主机
参考网址
https://www.cnblogs.com/connect/p/nginx-vhost.html
虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响的。
通过nginx可以实现虚拟主机的配置,nginx支持三种类型的虚拟主机配置,
1、基于ip的虚拟主机
如果是使用一台计算机测试需要为虚拟机添加ip
ifconfig ens33:1 192.168.204.151
ifconfig ens33:2 192.168.204.152
配置文件示例
server {
listen 192.168.204.151:80;
root /var/wwwroot/site1;
index index.html;
location / {
}
}
server {
listen 192.168.204.152:80;
root /var/wwwroot/site2;
index index.html;
location / {
}
}
2、基于域名的虚拟主机
如果是使用一台计算机测试需要修改 配置文件
(C:\Windows\System32\drivers\etc\ 修改hosts
文件)
server {
listen 80;
server_name site1.test.com;
root /var/wwwroot/site1;
index index.html;
location / {
}
}
server {
listen 80;
server_name site2.test.com;
root /var/wwwroot/site2;
index index.html;
location / {
}
}
3、基于端口的虚拟主机
server {
listen 8081;
root /var/wwwroot/site1;
index index.html;
location / {
}
}
server {
listen 8082;
root /var/wwwroot/site2;
index index.html;
location / {
}
}
http服务上支持若干虚拟主机。每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置。在提供mail服务的代理时,也可以建立若干server。每个server通过监听地址或端口来区分。
listen
监听端口,默认80,小于1024的要以root启动。可以为listen *:80、listen 127.0.0.1:80等形式。
server_name
服务器名,如localhost、www.example.com,可以通过正则匹配。
反向代理
正向代理
正向代理就是我们平常使用的那种代理软件的效果,我们将自己的请求发给代理服务器,然后再由代理服务器发送给目标服务器;
客户端想要访问一个服务器,但是它可能无法直接访问这台服务器,这时候这可找一台可以访问目标服务器的另外一台服务器,而这台服务器就被当做是代理人的角色 ,称之为代理服务器,于是客户端把请求发给代理服务器,由代理服务器获得目标服务器的数据并返回给客户端。客户端是清楚目标服务器的地址的,而目标服务器是不清楚来自客户端,它只知道来自哪个代理服务器,所以正向代理可以屏蔽或隐藏客户端的信息。
反向代理
反向代理,顾名思义,方向相反,当代理服务器收到请求后,依照某种规则,转发给不同的服务器。
从上面的正向代理,你会大概知道代理服务器是为客户端作代理人,它是站在客户端这边的。其实反向代理就是代理服务器为服务器作代理人,站在服务器这边,它就是对外屏蔽了服务器的信息,常用的场景就是多台服务器分布式部署,像一些大的网站,由于访问人数很多,就需要多台服务器来解决人数多的问题,这时这些服务器就由一个反向代理服务器来代理,客户端发来请求,先由反向代理服务器,然后按一定的规则分发到明确的服务器,而客户端不知道是哪台服务器。常常用nginx来作反向代理。
反向代理环境配置
案例 两台虚拟机中的 两个tomcat服务通过nginx反向代理
向两台虚拟机中分别配置 Tomcat 服务器,并开启服务
分别标识出 两台虚拟机中的tomcat 页面 作出区分
默认配置
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
修改添加为
server {
listen 81;
server_name localhost;
location / {
#域名aaa.test.com的请求全部转发到tomcat_server1即tomcat1服务上
proxy_pass http://192.168.3.163:8080;
#欢迎页面,按照从左到右的顺序查找页面
index index.jsp index.html index.htm;
}
}
server {
listen 82;
server_name localhost;
location / {
#域名bbb.test.com的请求全部转发到tomcat_server2即tomcat2服务上
proxy_pass http://192.168.3.164:8080;
index index.jsp index.html index.htm;
}
}
测试使用端口的虚拟主机配置 (需要开启 nginx 服务器防火墙的的 81和82端口)
分别访问
nginx :81 能够进入到 http://192.168.3.163:8080
nginx :82 能够进入到 http://192.168.3.164:8080
反向代理设置成功
动静分离测试
163 服务器下新建demo.jsp 页面
<%@ page session="false" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title><%=request.getServletContext().getServerInfo() %></title>
<body>
<h1>192.168.3.163</h1>
<%
String addr = request.getRemoteAddr();
out.write("远程地址: "+addr);
%>
</body>
</html>
164 服务器下新建 demo.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h1>192.168.3.164 html 静态页面</h1>
</body>
</html>
nginx 服务器环境设置
server {
listen 80;
server_name localhost;
# 当用户访问以.jsp 结尾的文件的时候, 跳转到 163 服务器
location ~\.jsp$ {
proxy_pass http://192.168.3.163:8080;
index index.jsp index.html index.htm;
}
# 当用户访问以.html 结尾的文件的时候, 跳转到 164 服务器
location ~\.html$ {
proxy_pass http://192.168.3.164:8080;
index index.html index.htm;
}
}
含义为 ,
当用户访问以.jsp 结尾的文件的时候, 跳转到 163 服务器
当用户访问以.html 结尾的文件的时候, 跳转到 164 服务器
测试
String addr = request.getRemoteAddr();
获取请求对象的 ip地址
测试得出结论 : 远程主机 , 并非客户机, 而是 nginx 主机,
相当于 是nginx 服务器代理客户机进行访问
网址抽取
upstream tomcat_server1 {
server 192.168.101.5:8080;
}
# 配置一个代理服务器
upstream tomcat_server2 {
server 192.168.101.6:8080;
}
在之后的 localtion中
location ~\.html$ {
# 使用外部配置的服务器地址
proxy_pass http://tomcat_server1;
index index.html index.htm;
}
负载均衡
含义
负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
当 用户量过多的时候, 一个tomcat 无法承载过多请求.
nginx作为负载均衡服务器,用户请求先到达nginx,再由nginx根据负载配置将请求转发至 tomcat服务器。
案例实现
服务器环境
一个nginx 服务器
192.168.3.126
两个tomcat 服务器
192.168.3.163
192.168.3.164
当用户访问 nginx 的时候, 由nginx 负责切换不同的 tomcat 服务器,来处理用户请求
nginx.conf配置
upstream tomcat_server{
server 192.168.3.163:8080 weight=1;
server 192.168.3.164:8080 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat_server;
index index.jsp index.html index.htm;
}
}
版本问题解决
报错如下
The character [_] is never valid in a domain name.
nginx配置文件中配置upstream时用了“_”字符,如上用的tomcat_server,直接报错了。
改成tomcatserver,即不使用“_”字符就好了。主要还是版本原因
负载均衡策略
1、热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB…
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
2、轮询:nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB…
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
}
3、加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB…
upstream mysvr {
server 127.0.0.1:7878 weight=1;
server 192.168.10.121:3333 weight=2;
}
4、ip_hash:nginx会让相同的客户端ip请求相同的服务器。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
ip_hash;
}
设备状态
down 表示单前的server暂时不参与负载
weight 权重,默认为1。 weight越大,负载的权重就越大。
max_fails 允许请求失败的次数默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误
fail_timeout max_fails次失败后,暂停的时间。
backup 备用服务器, 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
后续
使用keepalived+nginx 实现 负载均衡 + 高可用
keepalived
keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。 Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
nginx是以多进程的方式来工作的。
nginx在启动后,会有一个master进程和多个worker进程
master进程主要用来管理worker进程: