一、Nginx的简介
nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。
二、Nginx的优点
- 跨平台、配置简单;
- 采用单线程来异步非阻塞处理请求、避免多线程CPU 的上下文切换带来的损耗;
- 内存消耗小,支持高并发连接;
- 成本低廉,且开源;
- 稳定性高,宕机的概率非常小;
三、Nginx的安装
- 使用docker拉取nginx镜像;
docker pull nginx
- 查看拉取的nginx镜像信息
docker images nginx
- 创建nginx的配置文件的挂载目录,通过docker启动的nginx容器,nginx的配置文件是存在容器中的/etc/nginx目录下,如果想要修改nginx的配置文件的话就需要先进入到容器内,再找到其目录下的配置文件进行修改。如果是修改比较频繁的话,每次都要进入容器内进行修改还是挺麻烦的,现在在容器启动前在主机上创建nginx配置文件挂载的目录,后面启动的时候直接将容器内的配置文件挂载到主机上,后续修改nginx的配置文件就直接在挂载到主机的目录下修改就好。
# 创建挂载目录
mkdir -p /usr/local/src/nginx/conf
mkdir -p /usr/local/src/nginx/log
mkdir -p /usr/local/src/nginx/html
- 创建并启动nginx容器,将容器中的相应文件copy到刚创建的挂载目录中,复制完成再停止并删除该容器
// 启动容器
docker run --name myNginx -d -p 80:80 nginx:latest
# 将容器nginx.conf文件复制到宿主机
docker cp 008aee5bc129:/etc/nginx/nginx.conf /usr/local/src/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp 008aee5bc129:/etc/nginx/conf.d /usr/local/src/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp 008aee5bc129:/usr/share/nginx/html /usr/local/src/nginx
// 停止容器
docker stop 008aee5bc129
// 删除容器
docker rm 008aee5bc129
注:008aee5bc129为容器id
- 重新启动容器并设置挂载目录
docker run \
-p 80:80 \
--name myNginx \
-v /usr/local/src/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/src/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /usr/local/src/nginx/log:/var/log/nginx \
-v /usr/local/src/nginx/html:/usr/share/nginx/html \
-d nginx:latest
四、Nginx配置文件(nginx.conf)
默认在Linux上安装的Nginx,配置文件在安装的nginx目录下的conf目录下,名字叫做nginx.conf。ginx.conf主要由三部分组成:全局块、events块、http块。
----------------------- 全局块 ------------------------------
# 全局配置
# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
worker_rlimit_nofile 1024;
-------------------------------------------------------------
************************events块*****************************
# nginx工作模式配置
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
*************************************************************
==========================http块=============================
# http设置
http {
# http全局块
....
# server块
server {
# server全局块
....
# location块
location {
....
}
# location块
location path {
....
}
# location块
location otherpath {
....
}
}
# server块
server {
....
location {
....
}
}
# upstream块
upstream name {
....
}
}
===============================================================
- 全局块:用于进行nginx全局信息的配置,常用配置项有如下:
(1)user:用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行;
(2)worker_processes:指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍;
(3)error_log:定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】;
(4)pid:用来指定进程id的存储文件的位置;
(5)worker_rlimit_nofile:用于指定一个进程可以打开最多文件数量的描述; - events块:用于nginx工作模式的配置,常用配置项有如下:
(1)worker_connections:指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的;
(2)multi_accept:配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接;
(3)use epoll:配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue;‘’ - http块:包括http全局块,以及多个server块。作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置,常规情况下,使用默认配置即可。
3.1、http全局块:http 全局块配置的指令包括文件引入、 MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
3.2、server块:用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息。每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块。
3.2.1、全局 server 块:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
3.2.2、location 块:一个 server 块可以配置多个 location 块,主要作用是根据请求地址路径的匹配,匹配成功进行特定的处理。在路由访问信息配置中关联到反向代理、负载均衡等等各项功能。
# 优先级1,精确匹配,根路径
location =/ {
proxy_pass http://192.168.80.102:8080;
}
# 优先级2,以某个字符串开头,以test开头的,优先匹配这里,区分大小写
# http://test.com/test/test1.html
location ^~ /test{
root /data/; # 匹配成功,实际访问路径为:/data/test/test1.html
index index.php index.html;
}
# 优先级3,区分大小写的正则匹配,匹配/image*****路径
# http://test.com/image/image1.html
location ~ /image{
alias /data/static/; # 匹配成功,实际访问路径为:/data/static/image1.html
index index.php index.html;
}
# 优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
location ~* .*\.(jpg|gif|png|js|css)$ {
root /data/image/;
index index.php index.html;
}
# 优先7,通用匹配
location / {
return 403;
}
location:后面跟的是请求地址路径匹配规则;
proxy_pass:设置反向代理的路径,匹配成功后跳转到该指定的路径;
root:用于指定访问虚拟主机的目录,实际访问文件路径会拼接URL中的路径;
alias:用于指定访问虚拟主机的目录,实际访问文件路径不会拼接URL中的路径;
index:在不指定访问具体资源时,默认展示的资源文件列表;
3.2.3、upstream块:主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器。
upstream name {
ip_hash;
server 192.168.1.100:8000;
server 192.168.1.100:8001 down;
server 192.168.1.100:8002 max_fails=3;
server 192.168.1.100:8003 fail_timeout=20s;
server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
ip_hash:指定的负载均衡调度算法是ip_hash;
server host:port:分发服务器的列表配置;
-- down:表示该主机暂停服务;
-- max_fails:表示失败最大次数,超过失败最大次数暂停服务;
-- fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求
五、正向代理与反向代理
- 正向代理:代理的是客户端,需要在客户端配置代理服务器,再将要访问的真实的服务器地址交给代理服务器,由代理服务器去请求这个真实的服务器的地址,拿到对应的数据后再返回给客户端。
- 反向代理:代理的是服务器端,客户端不需要任何配置,客户端只需要将请求发送给反向代理服务器即可,代理服务器将请求分发给真实的服务器,获取数据后将数据转发给客户端。隐藏了真实服务器,有点像网关。
六、负载均衡
主要运用在分布式场景,客户端的所有请求都将会先到nginx上,再由nginx根据相应的规则,将这些请求按时间顺序逐一分配到不同的后端服务器上处理。nginx负载均衡的实现规则有以下5种:
- 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某个服务器宕机,能自动剔除故障系统。
upstream myserver {
server 192.168.1.11:8081;
server 192.168.1.12:8082;
}
- weight权重:默认为 1,权重越高被分配的客户端越多。
upstream myserver {
server 192.168.1.11:8081 weight=2;
server 192.168.1.12:8082 weight=8;
}
- ip_hash( IP绑定):每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决动态网页存在的session共享问题。
upstream myserver {
ip_hash;
server 192.168.1.11:8081;
server 192.168.1.12:8082;
}
- fair(第三方插件):必须安装upstream_fair模块,对比 weight、ip_hash更加智能的负载均衡算法,fair算法可以根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配。
upstream myserver {
server 192.168.80.102:8081;
server 192.168.80.102:8082;
fair;
}
- url_hash(第三方插件):必须安装Nginx的hash软件包,按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。
upstream myserver {
server 192.168.80.102:8081;
server 192.168.80.102:8082;
hash $request_uri;
hash_method crc32;
}
七、动静分离
将静态资源 css、html、js等和动态资源(jsp servlet)进行分开部署,我们可以将静态资源直接部署在专门的服务器上,也可以直接放在反向代理服务器上(Nginx)所在在的服务器上,动态资源还是部署在真实的服务器上。然后请求来的时候,静态资源从专门的静态资源服务器获取,动态资源还是转发到后端服务器上。可以提高用户访问静态资源的响应速度,降低对后台服务的访问频率。