文章目录
一、前言
花了一个周末来归纳和总结,路过的朋友们,请点个赞,你的点赞是我前进的动力,谢谢啦!
首先必须安装nginx,可以参考我发表的文章 linux安装nginx1.18最详细的步骤
无论是你后台开发还是前端开发或者是运维等,都多多少少需要知道一下nginx,这一个如此出名的服务器。
Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
二、nginx正向代理
2.1 正向代理和反向代理的区分
下面我引用两张网上最热门,我也不知道为什么热门,大家先欣赏一下。
不知道大家能不能看得懂,我还是以下解释
- 正向代理中,代理服务器proxy与客户端client同属于一个LAN局域网,对server透明
正向代理用途:
1 为在防火墙内的局域网客户端提供访问Internet的途径
2 可以做缓存,加速访问资源
3 对客户端访问授权,上网进行认证
4 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
- 反向代理中,代理服务器proxy与server同属一个LAN局域网,对client透明
反向代理用途:
1 保证内网的安全
2 负载均衡
2.2 什么是正向代理
被和谐掉了
三、nginx反向代理
3.1 什么是反向代理
反向代理和正向代理的区别就是:正向代理代理客户端,反向代理代理服务器。
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
总结起来还是一句话:正向代理代理客户端,反向代理代理服务器。
3.2 反向代理的简单案例(案例1)
实现,我对 nginx.conf这个文件进行简单介绍
Nginx的HTTP配置主要包括三个区块,结构如下:
http { //这个是协议级别
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
gzip on;
server { //这个是服务器级别
listen 80; //监听的端口,nginx占用的端口
server_name localhost; //域名访问器,如果hosts存在该域名,会拼接到listen前面
location / { //这个是请求级, / 是指匹配根目录所有
proxy_pass http://127.0.0.1:80; //重定向的地址
//注意:反向代理之后,获取客户端ip地址为nginx服务器地址,这里需要nginx进行forward,设置真实的ip地址:
root html;
index index.html index.htm;
}
}
}
看完上面的解释之后,下面进行操作,找到 nginx.conf文件
vi /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.cancan.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://127.0.0.1:8082;
#root html;
index index.html index.htm;
}
如上图,我作以下的介绍
- 在linux服务端(ip为 192.168.102.144),提供了http://127.0.0.1:8082,但是不想给客户端(本地电脑A)直接进行访问。
- 采用nginx反向代理,采用80端口进行代理8082端口
- 本地电脑A,访问 http://192.168.102.144:80 即可访问 http://192.168.102.144:8082 的端口。
- 简单来说,就是80端口代理了8082端口的功能
3.3 反向代理实现负载均衡(案例2)
说明
#设定负载均衡的服务器列表
#upstream myproject {
#weigth参数表示权值,权值越高被分配到的几率越大
#max_fails 当有#max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查
#fail_timeout 在以后的#fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器
#}
3.3.1 配置服务器
upstream org.tonny.balance {
server 127.0.0.1:8081 weight=1;
server 127.0.0.1:8082 weight=1;
}
3.3.2 设置规则
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://cancan.balance;
#root html;
#index index.html index.htm;
}
3.3.3 图解
如上图,文字说明:
- 后台有两个服务,分别为服务A和服务B,对应端口为 8082 以及 8083
- nginx配置 upstream 有两个server,分别为服务A和服务B的地址。
- 从80端口访问,会重定向到 8082和8083
- 默认的规则是轮询的规制,所以客户端电脑访问的时候,会有轮询的效果
3.3.4 完整的配置
vi /usr/local/nginx/conf/nginx.conf
#gzip on;
upstream cancan.balance {
server 127.0.0.1:8082 weight=1;
server 127.0.0.1:8083 weight=1;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://cancan.balance;
#root html;
#index index.html index.htm;
}
3.4 反向代理之代理地址(案例三)
其实该案例为简单案例的变形,但是也是对于初学者来说,还是需要学习的
如上图,文字说明:
- 本地电脑A是无法访问本地电脑C的,因为本地电脑A网段为 172.23.x.x,而本地电脑C网段为192.168.x.x
- 本地电脑A想访问本地电脑C的资源,需要本地电脑B来进行中转。
- 本地电脑B采用反向代理,把用 localhost:81 的端口去代理 192.168.102.144
- 本地电脑C访问本地电脑B的81端口,等于访问本地电脑C的资源。
完整的配置
vi /usr/local/nginx/conf/nginx.conf
upstream cancan{
server 192.168.102.144;
}
server {
listen 81;
location / {
proxy_pass http://cancan;
}
}
四、nginx动静分离
4.1 访问静态html页面(案例4)
直接写nginx.conf配置
server {
listen 127.0.0.1:81;
location / {
root D:/OpenSources/nginx-1.18.0/static; #静态页面所在的路径
index index.html; #默认打开index.html
}
}
如上图,文字说明:
- 由nginx占用的81端口进行访问
- 规定了静态页面的目录,root D:/OpenSources/nginx-1.18.0/static; #静态页面所在的路径
- 打开index.html的静态页面
4.2 Nginx作为图片服务器(案例5)
如上图,文字说明:
- 该案例的图片路径为:D:/Opencv/C++/图片实例/log;
- 当访问路径为 端口81以及 gif|jpg|jpeg|png 结尾的时候,会通过请求控制器location进入访问。
- 当匹配路径成功后,就会在图片路径下寻找合适的图片。
- 当在图片路径下找不到图片 if ( !-e $request_filename) ,就会重定向到 proxy_pass http://192.168.102.144:81;#代理访问地址 进行查找。
4.2.1 完整的配置
修改如下 nginx.conf
server {
listen 127.0.0.1:81;
#location / {
#root D:/OpenSources/nginx-1.18.0/static;
#index index.html;
#}
location ~ .*\.(gif|jpg|jpeg|png)$ {
expires 24h;
root D:/Opencv/C++/图片实例/;#指定图片存放路径
access_log D:/Opencv/C++/图片实例/log;#图片路径
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path D:/Opencv/C++/图片实例/;#图片路径
proxy_redirect off;
proxy_set_header Host 127.0.0.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 1280k;
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 40k;
proxy_buffers 40 320k;
proxy_busy_buffers_size 640k;
proxy_temp_file_write_size 640k;
if ( !-e $request_filename)
{
#如果从本地路径访问不到资源,重定向下面的地址进行访问
proxy_pass http://192.168.102.144:81;#代理访问地址
}
}
4.2.2 访问本地的图片
注意地址路径
4.2.3 访问远端服务器的地址
注意地址路径
4.2.4 本地访问不到,到远端进行访问
注意地址路径
五、后记
如果能把我这个5个案例都测试一遍的同学们,应该可以把nginx了解得七七八八,其实正向代理和反向代理,核心都是对于请求的转发和代理,并没有很大的区分。
通俗的理解,正向代理就是客户端代理,反向代理就是服务端代码,除非是运维部署人员,不然没必要了解正向代理。
从nginx.conf中,我们需要记住的关键字有 协议级别, 服务器级别server, 请求级别location,upstream,proxy_pass, 了解这些关键字,面试挺有用的。
经过前面配置与测试,我们发现,Nginx 反向代理动静分离、负载均衡很简单,但是在生产环境,我们要做的还有很多,比如 日志文件,语法规则,匹配规则,rewrite语法等等。
程序员本来就是一条不断学习的路,有疑问或者对于本文有什么看法,可以留言,既然来了,我们就是朋友