尚硅谷Nginx教程由浅入深--笔记
- Nginx简介
- Nginx相关概念
- 反向代理
- 负载均衡
- 动静分离
- Nginx安装
- Nginx命令
- Nginx配置
- Nginx配置实例
- 反向代理1
- 反向代理2
- 负载均衡
- 动静分离
Nginx简介
Nginx是一个高性能的HTTP和反向代理服务器,特点是内存占用少,并发能力强。
Nginx相关概念
反向代理
- 正向代理
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。
- 反向代理
我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器就是一个服务器,暴露的是代理服务器的地址,隐藏了真是服务器的IP地址和端口。
负载均衡
- 负载均衡
负载均衡是将客服端的请求分发到多台服务器的方法
动静分离
- 动静分离
为了加快网站的解析速度,将网站的动态资源(jsp、servlet)和静态资源(html、css、js)分开。
Nginx安装
- 安装prce依赖
./configure
pcre-config --version
- 安装其他依赖
yum -y install zlib zlib-devel gcc-c++ libtool openssl openssl-devel
- 安装启动Nginx
yum install nginx
systemctl start nginx
systemctl enable nginx
默认安装位置/usr/local/nginx,启动方式:./nginx
- 防火墙
firewall-cmd --list-all
firewall-cmd --add-port=80/tcp permanent
firewall-cmd --reload
Nginx命令
命令路径/usr/local/nginx/sbin,可以先配置环境变量。
./nginx -v # 查看版本号
./nginx # 启动
./nginx -s stop # 关闭
./nginx -s reload # 重新加载
Nginx配置
配置文件路径:/usr/local/nginx/conf
-
第一部分 全局快
配置整体运行的指令 -
第二部分 events块
主要配置服务器的用户网络连接 -
第三部分 http块
- http全局块
- server块
Nginx配置实例
反向代理1
-
实现效果
浏览器访问www.123.com,跳转到Linux系统的Tomcat页面 -
准备工作
- 安装Tomcat,使用默认端口8080,并启动
- 开放端口
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
- 具体配置
- 在Windows中的C:/Windows/System32/drivers/etc/hosts在中配置域名
...
192.168.1.100 www.123.com
- 在Nginx的配置文件/usr/local/nginx/conf/nginx.conf中配置,配置http块的server块。
server {
listen 80;
server_name 192.168.1.100;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
- 测试,浏览器访问www.123.com,显示的是tomcat的页面,访问www.123.com:8080也可以显示tomcat页面,服务器端关闭了8080端口(firewall-cmd --remove-port 8080/tcp --permanent)后,只能通过80端口访问,无法通过8080端口访问。
反向代理2
- 实现效果
访问http://www.123.com:9001/edu/直接跳转到www.123.com:8080/edu/页面
访问http://www.123.com:9001/vod/直接跳转到www.123.com:8081/vod/页面 - 准备工作
- 准备两个tomcat服务器,一个8080端口,一个8081端口,开放8080,8081,9001端口
- 创建测试页面
- 具体配置
- 在Nginx的配置文件/usr/local/nginx/conf/nginx.conf中配置,配置http块的server块。
server {
listen 9001;
server_name 192.168.1.100;
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
}
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
}
}
- 测试
测试结果同实现效果 - location说明
location用户匹配URL,语法如下:
location [ = | ~ | ~* | ^~ ] uri {
...
}
1、=:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示uri包含正则表达式,且区分大小写
3、~*:用于表示uri包含正则表达式,并且区分大小写
4、^~:用于不含正则表达式的uri前,要求Nginx服务器找到表示uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
负载均衡
- 实现效果
在浏览器中输入http://192.168.1.100/edu/a.html,负载均衡效果,平均到8080和8081端口中。 - 准备工作
- 准备两台tomcat服务器,一台8080端口,一台8081端口。
- 在两台tomcat里面的webapps目录中,都创建名称是edu的文件夹,在edu文件夹中创建a.html文件,用于测试
- 实际配置
在http块中配置
upstream mystream {
server 192.168.1.100:8080;
server 192.168.1.100:8081;
}
server {
server_name 192.168.1.100;
location / {
proxy_pass http://mystream;
}
}
- 负载均衡策略
- 轮询(默认):按照时间顺序逐一分配到后端服务器
- weight:weight默认值为1,权重越高被分配的客户端越多
upstream mystream {
server 192.168.1.100:8080 weight=5;
server 192.168.1.100:8081 weight=10;
}
- ip_hash:每个请求按访问IP的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session问题
upstream mystream {
ip_hash;
server 192.168.1.100:8080 ;
server 192.168.1.100:8081 ;
}
- fair(第三方):按照后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream mystream {
server 192.168.1.100:8080 ;
server 192.168.1.100:8081 ;
fair;
}
注:fair是第三方的,因此需要安装模块,否则会有如下报错
nginx: [emerg] unknown directive “fair” in /usr/local/nginx/conf/nginx.conf:35
动静分离
-
什么是动静分离
动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主力推崇的方案;另一种是动态跟静态文件混合发布,通过Nginx来分开。
通过location指定不同的后缀名称实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务器端验证,直接通过浏览器自身确认是否过期即可所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
-
准备工作
- 新建/data目录,下面再新建/data/www/目录和/data/images/目录,将pic-1.png复制到/data/images/目录,将a.html复制到/data/images目录。
- 实际配置
在/usr/local/nginx/conf/nginx.conf中配置如下:
server {
server_name 192.168.1.100;
location /www/ {
/data/;
}
location /images/ { # 指定uri
/data/; # 指定路径
autoindex on; # 允许目录访问
}
}