【实用篇】Nginx的配置文件以及案例配置实现
一、nginx 的配置文件
nginx 的配置文件 nginx.conf 文件可以分为以下三部分:
-
全局快
- 从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数, 进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
比如上图中的
worker_processes 1
是 Nginx 服务器并发处理服务的关键配置, worker_processes 值越大,可以支持的并发处理量越多,但是会受到硬件、软件设备的制约。
- 从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数, 进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
-
event 块
- event 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对 work process 下的网络进行序列化,是否允许同时接收多个网络,选取哪种驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。
如上图中:
worker_connections 1024
:表示每个 work process 的最大连接数为 1024。
- event 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对 work process 下的网络进行序列化,是否允许同时接收多个网络,选取哪种驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。
-
http块
- 这一部分是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
http块又分为 http全局块 和 server 块。- http全局块
- http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
- server块
-
这块和虚拟主机有密切联系,虚拟主机从用户角度看,和一台独立的硬件主机是一样。而 http块可以有多个 server块,每一个 server块就相当于一个虚拟主机。每一个 server块 又可以分为 全局server块 以及多个 location块。
-
全局 server 块
最常见的配置就是本虚拟机主机的监听配置和本虚拟机的名称或 IP 配置。 -
location 块
这块的主要作用就是基于 Nginx 服务器接收到的请求字符串(例如:server_name/uri-string),对虚拟机主机名称(也可以是IP别名)之外的字符串(如前面的:/uri-string)进行匹配。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里执行。
-
- http全局块
- 这一部分是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
二、配置实例-反向代理
反向代理实例 1
1、实现效果:使用 nginx 反向代理,访问 www.123.com 直接跳转到 127.0.0.1:8080(linux虚拟机中的 tommcat 主页)
2、配置实例准备:安装 JDK 1.8、Tommcat
(1)JDK 的安装可以参考JDK 1.8 的安装方法
(2)安装 Tommcat
-
下载 Tommcat 的压缩包
下载地址Tommcat 压缩包下载地址参考
-
通过 Xftp 将该压缩包上传到 linux 系统下的 /usr/src/ 目录
-
在 /usr/src/ 目录下将压缩包解压
cd /usr/src tar -vxf apache-tomcat-7.0.70.tar.gz
-
启动 Tommcat
# 切换到 Tommcat 目录下的 bin 目录 cd apache-tomcat-7.0.70/bin # 执行启动命令 ./startup.sh
-
开放8080端口(如果已经开放则不需要再次开放)
# 打开配置文件 vim /etc/sysconfig/iptables # 在配置文件中添加一下内容 -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT # 按 esc 退出编辑模式,输入以下命令保存即可 :wq # 重启防火墙服务 service iptables restart
-
通过访问 ip + 8080端口号验证 tommcat 是否已经成功启动,看到如下页面即 tommcat 成功启动。
-
实现原理
(3)反向代理实例的配置
-
在本机 host 文件中配置 ip 地址所对应的域名
-
host 文件在 C:\Windows\System32\drivers\etc 目录下
-
使用编辑工具打开该 host 文件,并在该文件中加入以下内容
-
-
修改 nginx 的配置文件。( /usr/lcoal/nginx/conf/ 目录下的 nginx.conf 文件)
修改完后,按 ESC 退出编辑模式,再输入
:wq
保存退出。 -
在本地浏览器中地址栏输入
www.123.com
测试 nginx 反向代理是否成功,如果成功访问到 tomcat 的主页,说明配置成功。
反向代理实例 2
1、实现效果:使用nginx 反向代理, 根据访问的路径跳转到不同端口的服务中
nginx 监听端口为 9001。
访问 http://192.168.134.105:9001/edu/ 直接跳转到 127.0.0.1:8080
访问 http://192.168.134.105:9001/vod/ 直接跳转到 127.0.0.1:8081
2、配置实例准备:
(1)准备两个 tomcat,一个端口 8080 端口,一个 8081 端口,配置各自的页面以及端口号。
-
创建 tomcat8080 和 tomcat8081 文件夹
# 切换到 /usr/src/ 目录下 cd /usr/src # 创建两个空文件夹 mkdir tomcat8080 mkdir tomcat8081
-
和配置反向代理实例 1 一样,将 tomcat 的压缩包分别上传到新创建的文件夹 tomcat8081 和 tomcat8082,并解压
# 将 tomcat8080 中的压缩包解压 cd tomcat8080/ tar -xvf apache-tomcat-7.0.70.tar.gz # 将 tomcat8081 中的压缩包解压 cd tomcat8081/ tar -xvf apache-tomcat-7.0.70.tar.gz
-
修改 tomcat8081 中的配置文件的端口
cd /usr/src/tomcat8081/apache-tomcat-7.0.70/conf vim server.xml
-
两个 tomcat 都配置各自的页面,以便区分
然后使用 Xftp 分别上传到各自的文件夹中
-
开放 8080 端口和 8081 端口启动 两个 tomcat (开放端口,可参考反向代理配置实例 1或者以下开放 9001 端口),测试。
若访问页面如上,则说明两个 tomcat 配置成功。
(2)修改 nginx 的配置文件
-
在http 块中添加 server 块 加入如下内容
server { listen 9001; server_name 192.168.134.105; location ~/edu/ { proxy_pass http://127.0.0.1:8080; } location ~/vod/ { proxy_pass http://127.0.0.1:8081; } }
-
开放 9001 端口
# 打开配置文件 vim /etc/sysconfig/iptables # 在配置文件中添加一下内容 -A INPUT -m state --state NEW -m tcp -p tcp --dport 9001 -j ACCEPT # 按 esc 退出编辑模式,输入以下命令保存即可 :wq # 重启防火墙服务 service iptables restart
-
测试 nginx 反向代理是否成功
注意!!!:在测试之前,需要切换到
/usr/local/nginx/sbin
目录下,通过指令./nginx -s reload
重启 nginx 服务。在浏览器地址栏中,分别输入:
http://192.168.134.105:9001/edu/a.html
http://192.168.134.105:9001/vod/a.html
出现以上结果说明 nginx 反向代理成功。
补充:关于 location 指令的说明
该指令用于匹配 URL 地址。语法如下:
location [ = | ~ | ~* | ^~ ] uri {
}
1、= :用于不含正则表达式的 uri 前, 要求请求字符串与 uri 严格匹配,如果匹配 成功, 就停止继续向下搜索并立即处理该请求。
2、~: 用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式, 并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前, 要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求, 而不再使用 location 块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~*标识。
三、配置实例-负载均衡
1、实现的效果:在浏览器地址栏中输入 http://192.168.134.105/edu/a.html
,体现负载均衡效果,将请求平均分配到 8080 和 8081 端口中。
2、配置前准备:
(1)准备两个 tomcat 服务器,一台 8080 端口,一台 8081 端口,可参考反向代理实例2。
(2)在两台 tomcat 服务器的 webapps 目录中,创建名称为 edu 的文件夹,在 edu 文件夹中创建页面 a.html 用于测试。(可以类比反向代理实例2)
3、配置 nginx 实现负载均衡
在 http 块中编辑 server 块并添加 upstream 部分,具体代码如下:
upstream myserver{
server 192.168.134.105:8080;
server 192.168.134.105:8081;
}
server {
listen 80;
server_name 192.168.134.105;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://myserver;
}
}
配置好后,按 ESC
退出编辑模式,输入 :wq
保存退出。
4、重启 nginx 服务,测试负载均衡效果。
cd /usr/local/nginx/sbin/
./nginx -s reload
地址栏输入: http://192.168.134.105/edu/a.html
刷新页面
多次刷新页面可发现,两个页面交替出现,说明请求平均分配给 8080 端口的 tomcat 服务器和 8081 端口的 tomcat 服务器,负载均衡配置成功。
补充:nginx 分配服务器策略
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果服务器 down 掉,就会自动剔除该服务器。(这个是 nginx 默认的服务器分配策略,不用做额外的配置)
2、weight 权重
weight 代表权重,默认值是 1,权重越高被分配的客户端请求越多。
作用:指定轮询的几率,weight 和访问比率成正比,用于服务端性能不均的情况。
具体配置如下示例:
upstream myserver{
server 192.168.134.105:8080 weight=8;
server 192.168.134.105:8081 weight=10;
}
3、ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个客户端访问固定的一个后端服务器。
通俗的来说,就是每个请求第一次访问哪个服务器,后面同样 ip 地址的请求还是访问同一个服务器。比如说 http://192.168.134.105/edu/a.html 请求访问的服务器是 8080 端口的 tomcat 服务器,那么 ip 地址同样为 http://192.168.134.105 的其他请求还是访问 8080端口的 tomcat 服务器。
同时,该策略可以解决 Session 共享问题。
具体配置如下:
upstream myserver{
ip_hash;
server 192.168.134.105:8080;
server 192.168.134.105:8081;
}
4、fair(第三方)
按服务器的响应时间来分配请求,响应时间短的优先分配。
具体配置如下:
upstream myserver{
server 192.168.134.105:8080;
server 192.168.134.105:8081;
fair;
}
四、配置实例-动静分离
1、什么是动静分离(详解)
Nginx 动静分离简单来说就是把动态跟静态请求分开, 不能理解成只是单纯的把动态页面和 静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开, 可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。
动静分离从目前实现角度来讲大致分为两种:
一种是纯粹把静态文件独立成单独的域名, 放在独立的服务器上, 也是目前主流推崇的方案; 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。
通过 expires 参数设置, 可以使 浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资 源设定一个过期时间, 也就是说无需去服务端验证, 直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件, 不建议使用 Expires 来缓存), 我这里设置 3d, 表示在这 3 天之内访问这个 URL, 发送 一个请求, 比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304, 如果有修改, 则直接从服务器重新下载, 返回状态码 200。
2、配置前的准备:准备好静态资源
在根目录下新建一个 source 文件夹,并在 source 文件夹下创建 image 文件夹(用来存放图片)和 www 文件夹(用来存放 html 页面)。
3、nginx 配置文件配置动静分离
server {
listen 80;
server_name 192.168.134.105;
#charset koi8-r;
#access_log logs/host.access.log main;
location /www/ {
root /source/;
index index.html index.htm;
}
location /image/ {
root /source/;
autoindex on;
}
}
4、切换到 /usr/local/nginx/sbin/
目录,重启 nginx 服务,测试动静分离是否配置成功。
cd /usr/local/nginx/sbin/
./nginx -s reload
-
在浏览器输入地址
http://192.168.134.105/image/
可以看到目录下文件的展示。
点击图片连接,可见图片的具体内容。 -
在浏览器地址栏中输入
http://192.168.134.105/www/a.html
,见以下内容则说明配置成功。
五、配置 Nginx 高可用
1、什么是高可用
通俗的来说,就是保证当一个 Nginx 服务器宕机时,有另外一个 Nginx 服务器代替它,来保证能完成相关的功能。
2、需要实现的效果:
如上图:要实现 Nginx 高可用需要配置一个主机和一个或多个从机(备用机),各自有各自的 ip 地址,Nginx 服务集群以相同的 ip 地址对外暴露。当主机 nginx 1宕机时,从机 nginx 2 可以代替主机,实现反向代理、负载均衡等效果。
3、配置高可用的准备工作:
(1)需要两台服务器(linux 虚拟机,我的是 192.168.134.105 和 192.168.134.128)
(2)在两个虚拟机上安装 nginx,可参考 如何在Linux虚拟机中安装 Nginx
(3)在两个虚拟机上安装 keepalived 软件,执行 如下yum 命令即可:
yum install keepalived -y
4 、具体配置高可用(主从配置)
- (1)配置 keepalived
安装完之后,在 /etc/ 目录下会生成目录 keepalived,有文件 keepalived.conf,编辑此文件。
下面以主机 nginx 为例来配置(备机可参考修改):global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.134.105 # nginx 服务器的 ip 地址 smtp_connect_timeout 30 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 MASTER # 备份服务器上将 MASTER 改为 BACKUP interface eth0 # 网卡 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 authentication { auth_type PASS auth_pass 8888 } virtual_ipaddress { 192.168.134.10 # VRRP H 虚拟地址 } }
- (2)在
/usr/local/src/
目录下,创建脚本文件 nginx_check.sh,并添加以下内容(以主机为例,备机同理):#!/bin/bash # 如果进程中没有nginx则将keepalived进程kill掉 A=`ps -C nginx--no-header |wc -l` ## 查看是否有 nginx进程 把值赋给变量A if [ $A -eq 0];then ## 如果没有进程值得为零 /usr/local/nginx/sbin/nginx sleep 2 if [ $A -eq 0 ];then service keepalived stop ## 则结束 keepalived 进程 fi fi
- (3)启动两台服务器的 nginx 和 keepalived
# 切换到 nginx 的 sbin 目录 cd /usr/local/nginx/sbin/ # 启动 nginx ./nginx # 如果已经启动,则使用以下命令重启 ./nginx -s reload
# CentOS 6.5 启动服务的命令 service keepalived start # CentOS 7 启动 keepalived 服务命令 systemctl start keepalived.service
5、测试 nginx 高可用
(1)在浏览器输入前面所配置的 虚拟 ip 地址 http://192.168.134.10
测试是否可以访问,如果可以访问说明主服务器是可以通过虚拟 ip 进行访问的。
(2)手动将 nginx 主服务器停掉模拟主服务器宕机,再次刷新页面,测试 nginx 集群的高可用(即所有请求是否会转发到备份服务器中)。
# 切换到 nginx 的 sbin 目录
/usr/local/nginx/sbin
# 关闭 nginx 服务
./nginx -s stop
刷新页面还是可以访问到 nginx 欢迎页,说明说明 nginx 集群高可用到此配置成功!