Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。
Nginx的稳定性、功能集、示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。
Nginx的应用场景
1、http服务器。nginx是一个http服务可用独立提供http服务。可用做网页静态服务器。
2、虚拟主机。可以实现在一台服务器虚拟多个网站。例如个人网站使用的虚拟主机。
3、方向代理,负载均衡。当网站到达一定程度后,单台服务器不能满足用户的请求时,需要用到多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载均衡,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
1,下载最新nginx镜像
docker pull nginx
2,运行nginx容器
docker run -id -p 80:80 nginx
docker restart 容器id
4,关闭nginx容器:
docker stop 容器id
我们如何来找nginx的安装目录呢,有两种方法;
第一种:通过dockerfile的定义来看;
第二种,简单粗暴,直接搜索
find / -name nginx
# 配置worker进程运行用户
user nginx;
# 配置过程进程数目,根据硬件配置,一般是和CPU数量一致,或者CPU数量的两倍,达到最佳性能。
worker_processes 1;
# 配置全局错误日志文件以及配置级别 [ debug | info | notice | warn | error | crit ]
#关于日志级别:
#在配置nginx.conf 的时候,有一项是指定错误日志的,默认情况下你不指定也没有关系,因为nginx很少有错误日志记录的。但有时出现问题时,是有必要记录一下错误日志的,方便我们排查问题。
#error_log 级别分为 debug, info, notice, warn, error, crit 默认为crit, 该级别在日志名后边定义格式如下:
#error_log /your/path/error.log crit;
#crit 记录的日志最少,而debug记录的日志最多。如果你的nginx遇到一些问题,比如502比较频繁出现,但是看默认的error_log并没有看到有意义的信息,那么就可以调一下错误日志的级别,当你调成error级别时,错误日志记录的内容会更加丰富。
error_log /var/log/nginx/error.log warn;
# 配置进程pid文件
pid /var/run/nginx.pid;
#events 是配置工作模式和连接数
events {
worker_connections 1024; # 配置每个worker进程连接数上限
}
#说明:nginx支持得总连接数=worker_processes * worker_connections
#配置http服务器
http {
include /etc/nginx/mime.types; # 配置nginx支持哪些多媒体类型
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 /var/log/nginx/access.log main; #配置访问日志 ,并使用上面的格式
sendfile on; # 开启高效文件传输模式
#tcp_nopush on; #开启防止网络阻塞模式
keepalive_timeout 65; #长连接超时时间,单位秒
#gzip on; #开启gzip压缩输出
include /etc/nginx/conf.d/*.conf;
}
_default.conf
server {
listen 80; # 监听端口
server_name localhost; # 配置服务名
#charset koi8-r; # 配置字符集
#access_log /var/log/nginx/host.access.log main; #配置本虚拟主机访问日志
# 匹配/请求 ,/是根路径请求,会被该location匹配到并且处理
location / {
root /usr/share/nginx/html; #root是配置服务器的默认网关根目录位置
index index.html index.htm; #配置首页文件的名称
}
#error_page 404 /404.html; #配置404页面
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #配置50x错误页面
location = /50x.html {
root /usr/share/nginx/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;
#}
}
挂载容器目录启动nginx容器
为后续方便修改nginx的配置文件,我们将nginx的配置目录copy到宿主机,将其作为新nginx容器启动的共享目录;
cd /home
mkdir data
docker cp 容器ID:/etc/nginx /home/data/nginx
什么是代理服务器?
代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在代理服务器的硬盘中,再发送给客户机。
为什么要使用代理服务器?
1,提高访问速度
2,防火墙作用
3,通过代理服务器访问不能访问的目标站点
什么是正向代理?
正向代理,架设在客户机与目标主机之间,只用于代理内部网络对 Internet 的连接请求,客户机必须指定代理服务器,并将本来要直接发送到 Web 服务器上的 Http 请求发送到代理服务器中。
什么是反向代理?
反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。
实现反向代理
1、启动nginx
docker run -it --name=myNginx -v /home/data/nginx:/etc/nginx -p 80:80 nginx
2、启动tomcat
docker run -d -p 8080:8080 tomcat镜像id
3、在docker 默认的是桥接模式,回给分配不同的主机。需要使用如下命令查看所分配的IP
docker inspect 容器ID
网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时候来自web前端的压力,也能让人十分头痛。怎样将同一个域名的访问分散到两台或更多的机器上呢?这其实就是另一种负载均衡了,nginx自身就可以做到,只需要做个简单的配置就行。
nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态、静态页面的分离,可以按照轮询、ip哈希、URL哈希、权重等多种方式对后端服务器做负载均衡,同时还支持后端服务器的健康检查。
1、宿主机里home目录下新建tomcat1和tomcat2目录,复制容器里conf,webapps到宿主机
docker cp 30e862c2d8f1:/usr/local/tomcat/conf /home/tomcat1
docker cp 30e862c2d8f1:/usr/local/tomcat/webapps /home/tomcat1
2、修改共享目录tomcat1、tomcat2中的文件(server.xml、index.jsp),用于查看负载均衡的效果;
docker run -d --name tomcat1 -p 8080:8080 -v /home/tomcat1/conf/:/usr/local/tomcat/conf/ -v /home/tomcat1/webapps/:/usr/local/tomcat/webapps/ 635d3cfe400a
docker run -d --name tomcat2 -p 9090:9090 -v /home/tomcat2/conf/:/usr/local/tomcat/conf/ -v /home/tomcat2/webapps/:/usr/local/tomcat/webapps/ 635d3cfe400a
运行两条命令之后如上图是否在容器运行,这个时候的 9090 端口是不可以运行的。为了能够访问和查看负载均衡的效果;就需在共享目录修改这两个文件:server.xml、index.jsp
注意:修改这玩意只是为了看效果
在ROOT目录下修改index.jsp 去掉它的页面效果,留下一个8080 方便区别。另一个也如此。
3、修改 nginx.conf 指定具体代理的目标服务器
upstream www.hyf.com{
server 172.17.0.3:8080 weight=1;
server 172.17.0.4:9090 weight=2;
}
4、在defalut.conf 中修改 :server_name 配置访问的域名 、erver.location指定跳转到目标服务器
测试:
重启 nginx 容器,输入网址 www.hyf.com
效果:
加了 weight 权重策略,9090 端口的值大,访问的次数较多。
每个请求轮流分配到不同的后端服务器,如果后端服务器挂掉,则自动被剔除;
参考配置:
upstream www.hyf.com{
server 172.17.0.3:8080 ;
server 172.17.0.4:9090 ;
}
weight权重
根据weight权重,请求会根据权重比例分发给不同后端服务器,weight权重越高,分配的比例越大;
实际分配,根据服务器硬件配置高低,来具体分配weight权重,硬件配置高的,weight就配置高点;
参考配置:
upstream www.hyf.com{
server 172.17.0.3:8080 weight=1;
server 172.17.0.4:9090 weight=2;
}
ip_hash
ip_hash策略是根据用户客户端的IP的hash值来分配具体服务器,这样每个访问客户端都会固定访问某一个服务器,这样可以解决session丢失问题,很多网站都采用这种策略来搞负载均衡,主要考虑到session问题;
参考配置:
upstream www.hyf.com{
ip_hash;
server 172.17.0.3:8080 ;
server 172.17.0.4:9090 ;
}
least_conn最少连接
web请求会被分发到连接数最少的服务器上;
参考配置:
upstream www.hyf.com{
least_conn;
server 172.17.0.3:8080 ;
server 172.17.0.4:9090 ;
}
备份 backup配置;
其他非backup机器挂掉后,才会请求backup机器;
参考配置:
upstream www.hyf.com{
server 172.17.0.3:8080 ;
server 172.17.0.4:9090 backup ;
}
宕机 down配置;
配置down的服务器不参与负载均衡;这样down所标记的服务器可以安心的升级了;
参考配置:
upstream www.hyf.com{
server 172.17.0.3:8080 ;
server 172.17.0.4:9090 down ;
}
这两个配置很多时候用于运维,维护某个机器的时候用;
静动分离,就是将css、js、jpg等静态资源和jsp等动态资源分开处理,以此提高服务器响应速度,提高性能。
操作实现
1、先搞一个静态资源服务器
docker run -it -p 1010:1010 --name=staticNginx -v /home/data/nginx2:/etc/nginx -v /home/data/nginx2data:/home/nginx 镜像ID
容器运行起来了:
修改nginx2中nginx.conf与default.conf文件
nginx.conf中不要配置upstream,因为nginx2只是用作静态资源服务器用,并非是代理服务器
2、现在有web服务器两台tomcat1、tomcat2,静态资源服务器一台staticNginx,可以更改代理服务器myNginx的配置了;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { # 匹配所有以 gif,jpg或jpeg,xxxx结尾的请求
proxy_pass http://static.hyf.com;
}
location ~ .*\.(js|css)?$ {
proxy_pass http://static.hyf.com;
}
location ~ .*\.(html)?$ {
proxy_pass http://static.hyf.com;
}
http.server.localtion语法
基本语法: location [=|||^~]/uri/{…}
= 严格匹配, 如果这个查询匹配,将停止搜索并立即处理此请求
~ 区分大小写匹配(可用正则表达式)
~ 不区分大小写匹配(可用正则表达式)
!~ 区分大小写匹配
!~* 不区分大小写匹配
^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx如果路径匹配那么不测试正则表达式
3、修改tomcat1、tomcat2中的index.jsp,方便myNginx代理服务器的代理效果
<head>
<title><%=request.getServletContext().getServerInfo() %></title>
<link href="favicon.ico" rel="icon" type="image/x-icon" />
<link href="favicon.ico" rel="shortcut icon" type="image/x-icon" />
<link href="tomcat.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" href="http://static.hyf.com/static/css/common.css">
<script src="http://static.hyf.com/static/js/common.js"></script>
</head>
<body>
8080
<img src="http://static.hyf.com/static/img/peien.jpg" alt="">
</body>
另一个9090端口的也按此步骤修改(方便查看效果)
4、最终动静分离效果