Nginx 快速上手
前言
去年的时候使用
SpringBoot开发了自己的博客,然部署到云服务器上,就是使用Nginx和Tomcat部署的, 相关的反向代理或者负载均衡虽然确实实操过,但是都是现找其他人的博客操作的,就是进行了快速的学习和了解,但是没有系统学习。之所以要整理就是为了系统性的学习一下并整理一下。也方便忘了时及时查阅温习。
一、Nginx 快速熟悉
1、了解
Nginx 是一个高性能的 HTTP 和反向代理服务器。
Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、 php
等。但是不支持 java。 Java 程序只能通过与 tomcat 配合完成。
2、特点
(1)占有内存少,
(2)并发能力强(据说有报告表明能支持高达 50,000 个并发连接数 )
(3)支持反向代理
(4)支持负载均衡
(5)支持动静分离
3、反向代理
在客户端访问页面时将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址及端口。
4、负载均衡
单个服务器或提升硬件比较难以解决访问量和数据量的增长导致请求缓慢或宕机的背景下,出现集群概念。增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是所说的负载均衡。
5、动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速
度。降低原来单个服务器的压力。
动静分离的方式:
(1)统一部署,静态请求解析到指定静态资源目录。
(2)分开部署,静态请求转发到静态资源服务器。
二、Nginx 安装
Nginx 安装分为两种方式。其实也不是官方的。
1、通用方式
第一步, 安装 pcre
wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gzPCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。
nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。
下载成功后解压文件
tar -zxvf pcre-8.37.tar.gz进入目录执行
./configure 完成后,回到 pcre 目录下执行
make
make install第二步, 安装一些需要的依赖
安装 zlib,安装 gcc,安装 openssl
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel第三步, 安装 nginx
官方网址:http://nginx.org/en/download.html
Nginx官网提供了三个类型的版本Mainline version: Mainline 是 Nginx 目前主力在做的版本,可以说是开发版Stable version: 最新稳定版,生产环境上建议使用的版本Legacy versions: 遗留的老版本的稳定版。
建议选择稳定版。
可以直接下载到目录。
也可以下载之后再上传到服务器。
1、 解压缩 nginx-xx.tar.gz 包。
tar -zxvf nginx-xx.tar.gz2、 进入解压缩目录, 执行./configure。
./configure3、 执行编译安装
make && make install2、YUM方式
1、添加源
默认情况Centos7中无Nginx的源,后面Nginx官网提供了Centos的源地址。因此可以如下执行命令添加源:
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm2、安装Nginx
可以使用 search 命令:
yum search nginx看看是否已经添加源成功。如果成功则执行下列命令安装Nginx。
sudo yum install -y nginx3、防火墙端口相关
如果需要的话,可能用得上。如果是云服务器,自己登录控制台看看相关端口是否已经开放。
查看开放的端口号
firewall-cmd --list-all设置开放的端口号
firewall-cmd --add-service=http –permanent
sudo firewall-cmd --add-port=80/tcp --permanent重启防火墙
firewall-cmd –reload三、Nginx 常用命令
如果你不确定你的 Nginx 到底安装到哪里了,使用 whereis 命令查找一下。
[root]# whereis nginx
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz1、查看版本命令:
nginx -v2、启动命令:
(1)执行执行启动:
start  nginx (2)到 /usr/sbin/ 目录执行命令启动:
./nginx(3)也可以使用Linux 方式
sudo systemctl start nginx.service3、关闭命令:
(1)快速停止或关闭
nginx stop或
nginx -s stop(2)正常停止或关闭
nginx -s quit(3)也可以使用 Linux 方式
sudo systemctl start nginx.service4、配置检查:
修改配置文件之后执行用来检查配置文件是否有错误的命令,如果有会给出提示。
nginx -t5、配置加载:
修改配置文件之后,不需要重启服务,检查配置文件正确之后,直接加载新的配置文件的命令。
nginx -s reload四、Nginx 配置文件
1、nginx 配置文件目录
一般在 nginx/conf/ 目录下,具体目录使用 whereis 找一下。我使用yum 安装,配置文件目录在 /etc/nginx/目录下有个 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;
        }
    }
}2、配置文件细分
nginx.conf 文件大致分三个部分。
(1)全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx服务器的用户(组)、允许生成的 worker process 数, 进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
比如第一行配置:
worker_processes 1;这是 Nginx 服务器并发处理服务的关键配置, worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
(2)events 块
 events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。
上述例子就表示每个 work process 支持的最大连接数为 1024。
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
(3)http 块
 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。 需要注意的是: http 块也可以包括 http 全局块、 server 块。
A) http 全局块
 http 全局块配置的指令包括文件引入、 MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限、404等等。
B) server 块
 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。
 每个 http 块可以包括多个 server块,而每个 server 块就相当于一个虚拟主机。 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
 1)、全局 server 块
 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
 2)、location 块
 一个 server 块可以配置多个 location 块。
 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
五、配置实例
1、反向代理配置实例1
准备工作:安装一个 tomcat 并配置端口为 8081
nginx.conf 配置:
server{
    listen 80;
    server_name www.zhangxiaocai.cn
    location / {
        proxy_pass http://127.0.0.1:8081 ;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504
        index index.html index.htm index.jsp;
    }
}如上配置,我们监听 80 端口,访问域名为 www.zhangxiaocai.cn,不加端口号时默认为 80 端口,所以在浏览器访问该域名时会跳转到 127.0.0.1:8080路径上。
本地测试需要修改C:/Windows/System32/drivers/etc/hosts文件,在文件末尾追加以下内容
www.zhangxiaocai.cn   127.0.0.12、反向代理配置实例2
准备工作:安装2个 tomcat 并配置端口分别为 8081 和 8082 ,为了区分也可以准备2个不同的 index.html 页面。
nginx.conf 配置:
server{
    listen 80;
    server_name www.zhangxiaocai.cn
    location ~ /java/ {
        proxy_pass http://127.0.0.1:8081 ;
        index index.html index.htm index.jsp;
    }
    location ~ /spring/ {
        proxy_pass http://127.0.0.1:8082 ;
        index index.html index.htm index.jsp;
    }
}根据访问的路径跳转到不同端口的服务中 nginx 监听端口为 80,
访问 http://www.zhangxiaocai.cn/java/ 直接跳转到 127.0.0.1:8081
访问 http://www.zhangxiaocai.cn/spring/ 直接跳转到 127.0.0.1:8082
3、location 指令说明
location 指令用于匹配 URL。
语法如下:
location [ = | ~ | ~* |^~] uri {
}语法规则大致分两种:
(1)普通规则 Location
无前缀:普通匹配
= : 表示精准匹配;
^~ : ^表示取反,正则取反,就是表示不用正则;
无前缀匹配示例:
location ~* /xxx {
     # 匹配任何含有xxxd的请求。
}
location ~* \.(gif|jpg|jpeg)$ {
     # 匹配任何以 gif、jpg 或 jpeg 结尾的请求。
}精准匹配示例:
location = / {
    # 精准匹配,主机名后不带任何字符串
}正则取反匹配示例:
location ^~ /images/ {
 # 不使用正则,匹配任何以 /images/ 开头的任何查询并且停止搜索。
}(2)正则规则 Location
~ : 区分大小写;
~* : 不区分大小写;
语法规则优先级(由高到底)
(1)有精准匹配的优先匹配
(2)无精准匹配的执行普通匹配,普通匹配中优先最全/最长匹配
示例一:
location /xxx {
}此时普通匹配,匹配所有以 /xxx 开头的路径。
示例二:
访问地址:/uri/a/b/c/d
规则1: /a
规则2: /a/b
规则3:/a/b/c
规则3是与访问地址最长匹配
示例三:
访问地址:/uri/a/b/c/d
规则1:~ /a
规则2:~ /a/b
规则3:~ /a/b/c
规则3是与访问地址最长匹配,但是此时规则中如果有正则匹配,则会再次进行正则匹配,规则1会被命中执行 。
(3)无精准匹配,无普通匹配,执行正则取反的匹配,也是普通匹配的一种
(4)执行正则匹配
示例一:
location ~ /xxx {
}此时正则匹配,匹配所有包含 /xxx 的路径,区分大小写。
(5)匹配起始路径
location  /xxx {
    #此时正则匹配,匹配所有以 /xxx 开头的路径,区分大小写。
}
location ~* \.(gif|jpg|jpeg)$ {
     # 匹配任何以 gif、jpg 或 jpeg 结尾的请求。
}(6)匹配所有
location / {
}= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配 成功,就停止继续向下搜索并立即处理该请求。~:用于表示 uri 包含正则表达式,并且区分大小写。~*:用于表示 uri 包含正则表达式,并且不区分大小写。^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。
4、负载均衡配置实例
负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应 足够快,给用户很好的体验。
快速增长的访问量和数据流量催生了各式各样的负载均衡产品, 很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎, nginx 就是其中的一个,在 linux 下有 Nginx、 LVS、 Haproxy 等等服务可以提供负载均衡服务 。
准备工作:安装2个 tomcat 并配置端口分别为 8081 和 8082 ,为了区分也可以准备2个不同的 index.html 页面。
nginx.conf 配置:
http {
    ...
    upstream my_server{
        ip_hash;
        server 127.0.0.1:8081 weight=1;
        server 127.0.0.1:8082 weight=1;
    }
    ...
    server{
        location / {
            proxy_pass http://myserver;
            proxy_connect_timeout 10;
            ...
        }
    }
}5、nginx 服务均衡策略
Nginx 提供了几种分配方式(策略):
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2、 weight
weight 代表权,重默认为 1,权重越高被分配的客户端越多 指定轮询几率, weight 和访问比率成正比,用于后端服务器性能不均的情况。 例如:
upstream my_server_pool{
    server 192.168.0.121 weight=10;
    server 192.168.0.122 weight=10;
}3 、 ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。 例如:
upstream my_server_pool{ 
    ip_hash; 
    server 192.168.0.121:80; 
    server 192.168.0.122:80; 
} 4 、 fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream my_server_pool{ 
    server 192.168.5.21:80; 
    server 192.168.5.22:80; 
    fair; 
}    6、动静分离配置实例
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。
严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面, Tomcat 处理动态页面。
动静分离从目前实现角度来讲大致分为两种:
(1) 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
(2) 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。 通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。
 具体 Expires 定义:是给一个资 源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存),假如设置为 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。
动态资源代理配置:
location / {
    proxy_pass 路径
}静态资源代理配置:
location / {
    root 静态资源路径
    index  默认访问路径下的什么资源
    autoindex on; # 代表展示静态资源的全部内容,以列表的形式展开。
}配置文件实例:
server{
    listen 80;
    server_name www.zhangxiaocai.cn
    location /js/ {
        root /home/tomcat/webapps/test/js/;
        autoindex on;
    }
    location /image/ {
        root /home/tomcat/webapps/test/images/;
        autoindex on;
    }
}测试访问ok之后可以删除静态文件再试试,看看访问走的 nginx 还是 tomcat。
六、Nginx 原理
1、nginx基本原理:
 使用 master-workers 的机制,通过一个 master 主进程管理其他 worker 进行来处理客户端的请求和响应。
特点:
(1)每个 worker 进程都是独立的进程,不需要加锁。
(2)采用独立进程,相互之间不会影响,一个进程结束,不影响其他进程,服务不会中断,master 进程会启动新的 worker 进程。
(3)worker 进程 异常退出,只会导致当前进程 worker 上的请求失败,不会影响所有请求,降低运行风险。
2、相关设置
worker 设置
 nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进 程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话 下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
连接数 worker_connection
这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接 数,应该是 worker_connections * worker_processes 。当然,这里说的是最大连接数,对于 HTTP 请求本地资源来说 , 能 够支持的最大并发数量是 worker_connections * worker_processes,
如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes /2,
如果是 HTTP 作为反向代理来说,动态资源最大并发数量应该是 worker_connections * worker_processes /4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服 务的连接,会占用两个连接。
3、配置文件结构
- Nginx.conf 结构
 
- work_processes
 - events
 
- worker_connection
 - http
 
- server
 
- listen
 - server_name
 - location
 
- root
 - index
 
七、其他
https 已经在使用了,暂时还没加上。
遇到再补充吧~




