目录
Nginx简介
Nginx 是⼀款⾼性能的 http 服务器/反向代理服务器及电⼦邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师伊戈尔·赛索耶夫所开发,官⽅测试 nginx 能够⽀撑 5 万并发链接,并且cpu、内存等资源消耗却⾮常低,运⾏⾮常稳定。
Nginx应⽤场景
-
http 服务器。Nginx 是⼀个 http 服务可以独⽴提供 http 服务。可以做⽹⻚静态服务器。
-
虚拟主机。可以实现在⼀台服务器虚拟出多个⽹站。例如个⼈⽹站使⽤的虚拟主机。
-
反向代理,负载均衡。当⽹站的访问量达到⼀定程度后,单台服务器不能满⾜⽤户的请求时,需要⽤多台服务器集群可以使⽤ nginx 做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载⾼宕机⽽某台服务器闲置的情况。
-
动静分离
Nginx 安装
以Linux
centOS 7.x
为例,使用 yum
安装 Nginx
:
yum install nginx -y
安装完成后,通过 rpm -ql nginx
命令查看 Nginx
的安装信息:
# Nginx配置文件
/etc/nginx/nginx.conf # nginx 主配置文件
/etc/nginx/nginx.conf.default
# 可执行程序文件
/usr/bin/nginx-upgrade
/usr/sbin/nginx
# nginx库文件
/usr/lib/systemd/system/nginx.service # 用于配置系统守护进程
/usr/lib64/nginx/modules # Nginx模块目录
# 帮助文档
/usr/share/doc/nginx-1.16.1
/usr/share/doc/nginx-1.16.1/CHANGES
/usr/share/doc/nginx-1.16.1/README
/usr/share/doc/nginx-1.16.1/README.dynamic
/usr/share/doc/nginx-1.16.1/UPGRADE-NOTES-1.6-to-1.10
# 静态资源目录
/usr/share/nginx/html/404.html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
# 存放Nginx日志文件
/var/log/nginx
主要关注的文件夹有两个:
-
/etc/nginx/conf.d/
是子配置项存放处,/etc/nginx/nginx.conf
主配置文件会默认把这个文件夹中所有子配置项都引入; -
/usr/share/nginx/html/
静态文件都放在这个文件夹,也可以根据你自己的习惯放在其他地方;
如果提示“没有可用软件包 nginx”,则运行
sudo yum install epel-release
安装epel包后重新安装即可,出现该问题的原因是nginx并不在centos官方yum源中,而epel源可以为“红帽系”的操作系统提供额外的软件包
Nginx常用命令
Nginx
应用程序命令:
nginx #启动Nginx
nginx -s reload # 向主进程发送信号,重新加载配置文件,热重启
nginx -s reopen # 重启 Nginx
nginx -s stop # 快速关闭
nginx -s quit # 等待工作进程处理完成后关闭
nginx -T # 查看当前 Nginx 最终的配置
nginx -t # 检查配置是否有问题
Nginx配置
Nginx
的主配置示例:
# main段配置信息
user nginx; # 运行用户,默认即是nginx,可以不进行设置
worker_processes auto; # Nginx 进程数,一般设置为和 CPU 核数一样
error_log /var/log/nginx/error.log warn; # Nginx 的错误日志存放目录
pid /var/run/nginx.pid; # Nginx 服务启动时的 pid 存放位置
# events段配置信息
events {
use epoll; # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
worker_connections 1024; # 每个进程允许最大并发数
}
# http段配置信息
# 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http {
# 设置日志模式
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; # Nginx访问日志存放位置
sendfile on; # 开启高效传输模式
tcp_nopush on; # 减少网络报文段的数量
tcp_nodelay on;
keepalive_timeout 65; # 保持连接的时间,也叫超时时间,单位秒
types_hash_max_size 2048;
include /etc/nginx/mime.types; # 文件扩展名与类型映射表
default_type application/octet-stream; # 默认文件类型
include /etc/nginx/conf.d/*.conf; # 加载子配置项
# server段配置信息
server {
listen 80; # 配置监听的端口
server_name localhost; # 配置的域名
# location段配置信息
location / {
root /usr/share/nginx/html; # 网站根目录
index index.html index.htm; # 默认首页文件
deny 172.168.22.11; # 禁止访问的ip地址,可以为all
allow 172.168.33.44;# 允许访问的ip地址,可以为all
}
error_page 500 502 503 504 /50x.html; # 默认50x对应的访问页面
error_page 400 404 error.html; # 同上
}
}
-
main 全局配置,对全局生效;
-
events 配置影响 Nginx 服务器与用户的网络连接;
-
http 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
-
server 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块;
-
location 用于配置匹配的 uri ;
-
upstream 配置后端服务器具体地址,负载均衡配置不可或缺的部分;
Nginx的应用场景
http 服务器
-
在
/etc/nginx/conf.d
目录下添加子配置文件80.conf
server { listen 80; # 监听的端⼝ server_name localhost; # 域名或ip location / { # 访问路径配置 root /usr/share/nginx/html;# 根⽬录 index index.html index.htm; # 默认⾸⻚ } error_page 500 502 503 504 /50x.html; # 错误⻚⾯ location = /50x.html { root html; } }
-
进入
/user/share/nginx/html
目录下,修改或创建index.html
文件<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Welcome to Nginx</title> </head> <body> <h1>Hello,Nginx<h1> </body> </html>
-
重启 Nginx
-
访问你安装 Nginx 机器的ip:80,例如:
192.168.137.5:80
,显示如下页面
虚拟主机
虚拟主机是什么
虚拟主机,也叫“⽹站空间”,就是把⼀台运⾏在互联⽹上的物理服务器划分成多个“虚拟”服务器。虚拟主机技术极⼤的促进了⽹络技术的应⽤和普及。同时虚拟主机的租⽤服务也成了⽹络时代的⼀种新型经济形式。
虚拟主机有两种绑定方式:
-
通过端口绑定:即不同端口访问不同虚拟主机
-
通过IP绑定:通过不同IP访问不同虚拟主机
端口绑定
-
编写静态网站文件
-
进入
/user/share/nginx/html
目录下,创建index
文件夹mkdir index cd index vi index.html
-
进入
/user/share/nginx/html
目录下,创建regist
文件夹mkdir regist cd regist vi regist.html
-
编写
regist.html
文件<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>regist</title> </head> <body> <h1>regist page<h1> </body> </html>
-
在
/etc/nginx/conf.d
目录下添加子配置文件port.conf
server { listen 81; # 监听的端⼝ server_name localhost; # 域名或ip location / { # 访问路径配置 root /usr/share/nginx/html/index;# 根⽬录 index index.html index.htm; # 默认⾸⻚ } error_page 500 502 503 504 /50x.html; # 错误⻚⾯ location = /50x.html { root html; } } server { listen 82; # 监听的端⼝ server_name localhost; # 域名或ip location / { # 访问路径配置 root /usr/share/nginx/html/regist;# 根⽬录 index regist.html; # 默认⾸⻚ } error_page 500 502 503 504 /50x.html; # 错误⻚⾯ location = /50x.html { root html; } }
-
重启
nginx -s reload
,
访问192.168.137.5:81,
显示页面如下: -
访问
192.168.137.5:82
,
显示页面如下:
IP绑定
本地测试可以修改 hosts ⽂件(C:\Windows\System32\drivers\etc),在 hosts 文件中可以配置域名和 ip 的映射关系,如果 hosts ⽂件中配置了域名和 ip 的对应关系,则不需要⾛ dns 服务器。
-
在测试机器(即浏览器所在机器)上的 hosts 文件末尾添加两行:
192.168.137.5 www.fgba.com 192.168.137.5 regist.fgba.com
-
在
/etc/nginx/conf.d
目录下添加子配置文件ip.conf
server { listen 80; server_name www.fgba.com; location / { root /usr/share/nginx/html/index; index index.html index.htm; } } server { listen 80; server_name regist.fgba.com; location / { root /usr/share/nginx/html/regist; index regist.html; } }
-
重启 Nginx
-
访问 www.fgba.com,显示如下:
-
访问 regist.fgba.com,显示如下:
反向代理和负载均衡
什么是反向代理
反向代理(Reverse Proxy)⽅式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内 部⽹络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器 对外就表现为⼀个反向代理服务器。
⾸先我们先理解正向代理,如下图:
正向代理是针对你的客户端,⽽反向代理是针对服务器的,如下图:
反向代理案例
Tomcat安装
须先安装jdk,未安装jdk可执行命令安装:
yum install -y java-1.8.0-openjdk
-
官网下载tar.gz:Apache Tomcat® - Welcome!
-
在Linux中解压下载的压缩包:
tar -xzvf apache-tomcat-9.0.56.tar.gz
重命名解压后的文件:
mv apache-tomcat-9.0.56 tomcat9-8081
修改端口号:
cd tomcat9-8081/conf vi server.xml
找到以下位置
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改为
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
保存退出后,启动Tomcat服务
cd .. cd bin ./startup.sh
查询是否启动成功:
ps -ef|grep java
-
再次解压,操作同上,将端口号修改为8082即可。
tar -xzvf apache-tomcat-9.0.56.tar.gz
-
注意:在其中一个server.xml文件,修改如下位置
<!-- 将原来的8005端口修改为8085 --> <Server port="8085" shutdown="SHUTDOWN"> <!-- 将原来的8009端口修改为8089 --> <Connector port="8089" protocol="AJP/1.3" redirectPort="8443" />
-
以下界面说明已运行成功
编写页面
- 进入 tomcat9-8081 的 webapps 目录
cd /usr/local/tomcat9-8081/webapps
mkdir index
cd index
vi index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/9.0.56 8081</title>
</head>
<body>
<h1>This is a Tomcat.port is 8081</h1>
</body>
</html>
- 进入tomcat9-8082的webapps目录
cd /usr/local/tomcat9-8082/webapps
mkdir index
cd index
vi index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/9.0.56 8082</title>
</head>
<body>
<h1>This is a Tomcat.port is 8082</h1>
</body>
</html>
配置Nginx反向代理
- 在
/etc/nginx/conf.d
目录下添加子配置文件proxy.conf
upstream tomcat-fgba{
server 192.168.137.5:8081;
}
server {
listen 80; # 监听的端⼝
server_name www.fgba.cn; # 域名或ip
location / { # 访问路径配置
# root index;# 根⽬录
proxy_pass http://tomcat-fgba;
index index.html index.htm; # 默认⾸⻚
}
}
- 重启 Nginx
- 配置本地 hosts 文件
192.168.137.5 www.fgba.lb.cn
什么是负载均衡
负载均衡是建⽴在现有⽹络结构之上,它提供了⼀种廉价有效透明的⽅法扩展⽹络设备和服务器的带宽、增加吞吐量、加强⽹络数据处理能⼒、提⾼⽹络的灵活性和可⽤性。 负载均衡,英⽂名称为 Load Balance,其意思就是分摊到多个操作单元上进⾏执⾏,例如 Web 服务器、FTP 服务器、企业关键应⽤服务器和其它关键任务服务器等,从⽽共同完成⼯作任务。
Nginx配置负载均衡
- 在
/etc/nginx/conf.d
目录下添加子配置文件lb.conf
upstream tomcat-fgba-lb{ server 192.168.137.5:8081; server 192.168.137.5:8082; } server { listen 80; # 监听的端⼝ server_name www.fgba.lb.cn; # 域名或ip location / { # 访问路径配置 # root index;# 根⽬录 proxy_pass http://tomcat-fgba-lb; index index.html index.htm; # 默认⾸⻚ } }
- 重启Nginx
- 配置本地hosts文件
192.168.137.5 www.fgba.lb.cn
- 访问多次页面,http://www.fgba.lb.cn/index/index.html
常用负载均衡算法
- 轮询(默认)
注意:这里的轮询并不是每个请求轮流分配到不同的后端服务器,与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下 。如果后端服务器down掉,将自动剔除
- 权重
每个请求按一定比例分发到不同的后端服务器,weight值越大访问的比例越大,用于后端服务器性能不均的情况
修改 /etc/nginx/conf.d
目录下子配置文件 lb.conf
upstream tomcat-fgba-lb{
server 192.168.137.5:8081 weight=5;
server 192.168.137.5:8082 weight=2;
}
server {
listen 80; # 监听的端⼝
server_name www.fgba.lb.cn; # 域名或ip
location / { # 访问路径配置
# root index;# 根⽬录
proxy_pass http://tomcat-fgba-lb;
index index.html index.htm; # 默认⾸⻚
}
}
- ip_hash
ip_hash 也叫 IP 绑定,每个请求按访问 ip 的 hash 值分配,这样每个访问客户端会固定访问一个后端服务器,可以解决会话 Session 丢失的问题
修改 /etc/nginx/conf.d
目录下子配置文件 lb.conf
upstream tomcat-fgba-lb{
ip_hash;
server 192.168.137.5:8081;
server 192.168.137.5:8082;
}
server {
listen 80; # 监听的端⼝
server_name www.fgba.lb.cn; # 域名或ip
location / { # 访问路径配置
# root index;# 根⽬录
proxy_pass http://tomcat-fgba-lb;
index index.html index.htm; # 默认⾸⻚
}
}
- 最少连接
web请求会被转发到连接数最少的服务器上
修改 /etc/nginx/conf.d
目录下子配置文件 lb.conf
upstream tomcat-fgba-lb {
least_conn;
server 192.168.137.5:8081;
server 192.168.137.5:8082;
}
server {
listen 80; # 监听的端⼝
server_name www.fgba.lb.cn; # 域名或ip
location / { # 访问路径配置
# root index;# 根⽬录
proxy_pass http://tomcat-fgba-lb;
index index.html index.htm; # 默认⾸⻚
}
}
- 其他配置
配置1
upstream tomcat-fgba-lb {
server 192.168.137.5:8081;
#其它所有的非backup机器down(宕机)的时候,才请求backup机器
server 192.168.137.5:8082;
}
配置2
upstream tomcat-fgba-lb {
server 192.168.137.5:8081;
#down表示当前的server是down状态,不参与负载均衡
server 192.168.137.5:8082;
}
动静分离
动静分离是指在 web
服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提示整个服务的访问性和可维护性。
一般来说,都需要将动态资源和静态资源分开,由于 Nginx
的高并发和静态资源缓存等特性,经常将静态资源部署在 Nginx
上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。
使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。
Nginx 配置静态资源
当访问静态资源,则从 linux 服务器 /opt/nginx/static 目录下获取
- 修改
/etc/nginx/conf.d
目录下子配置文件lb.conf
upstream tomcat-fgba-lb{
least_conn;
server 192.168.137.5:8081;
server 192.168.137.5:8082;
}
server {
listen 80; # 监听的端⼝
server_name www.fgba.lb.cn; # 域名或ip
location / { # 访问路径配置
# root index;# 根⽬录
proxy_pass http://tomcat-fgba-lb;
index index.html index.htm; # 默认⾸⻚
}
#拦截以下后缀名的静态资源
location ~.*\.(js|css|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
root /opt/nginx/static;
}
}
说明
-
~ 表示正则匹配,也就是说后面的内容可以是正则表达式匹配
-
第一个点 . 表示任意字符
-
*表示一个或多个字符
-
. 是转义字符,是后面这个点的转义字符
-
| 表示或者
-
$ 表示结尾
-
整个配置表示以 .后面括号里面的这些后缀结尾的文件都由 nginx 处理
放置静态资源的目录,要注意一下目录权限问题,如果权限不足,给目录赋予权限;否则会出现403错误 ,
chmod 755 /opt/nginx/static
- 编写
/usr/local/tomcat9-8081/webapps/index/index.html
页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/9.0.56 8081</title>
</head>
<body>
<h1>This is a Tomcat.port is 8081</h1>
<img src="/1.png" />
</body>
</html>
- 编写
/usr/local/tomcat9-8082/webapps/index/index.html
页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Apache Tomcat/9.0.56 8082</title>
</head>
<body>
<h1>This is a Tomcat.port is 8082</h1>
<img src="/1.png" />
</body>
</html>
- 先访问一下
- 可以看到页面中未能显示
- 将
1.png
放入/opt/nginx/static
路径下
- 刷新页面
- 图片成功显示
参考文章
-
《万字总结,体系化带你全面认识 Nginx !》 作者:Lion 链接:万字总结,体系化带你全面认识 Nginx ! - 掘金 来源:稀土掘金
-
《yum 在线安装 nginx》 作者:萌萌丶小魔王 链接:yum 在线安装 nginx - 萌萌丶小魔王 - 博客园 来源:博客园
-
《CentOS在线安装JDK》 作者:名山丶深处 链接:CentOS在线安装JDK - 名山丶深处 - 博客园 来源:博客园