第二节:Nginx正/反向代理、配置文件整体说明、全局配置详解、http服务器配置详解
一. 正向/反向 代理
1. 正向代理
一句话总结:正向代理,代理的是客户端,代替客户端发送请求(屏蔽了客户端,server端并不知道真实的客户端地址,客户端和代理服务器在同一个网络环境下,一般是外网)
是指客户端与目标服务器之间增加一个代理服务器,客户端直接访问代理服务器,在由代理服务器访问目标服务器并返回客户端并返回 。这个过程当中客户端需要知道代理服务器地址,并配置连接。 比如FQ,我们不能直接访问外国的某些网站,需要中间找个代理。
常见例子:
FQ/VPN(访问一些无法访问的资源)、
干点坏事(别人记录下来的是代理服务器的地址)、
日常用的电脑就是通过正向代理服务器访问互联网的、
做缓存,加速访问资源
2. 反向代理
一句话总结:反向代理,代理的是服务端,代替服务端接收请求。(常用于服务器集群环境,反向代理屏蔽了具体某个服务器的地址,客户端不知道最终请求是哪个Server处理,反向代理和Server端在同一网络环境下,通常为内网)
是指客户端访问目标服务器,在目标服务内部有一个统一接入网关,用来将请求转发至后端真正处理的服务器并返回结果。这个过程当中客户端不需要知道实际服务器地址,代理对客户端而言是透明的。
常见例子:
保证内网安全,此时nginx是公网可访问的,而业务服务器是内网的。
负载均衡
3. 二者区别
4. 代理相关参数
A. 参数如下:
proxy_pass # 代理服务 proxy_redirect off; # 是否允许重定向 proxy_set_header Host $host; # 传 header 参数至后端服务 proxy_set_header X-Forwarded-For $remote_addr; # 设置request header 即客户端IP 地址 proxy_connect_timeout 90; # 连接代理服务超时时间 proxy_send_timeout 90; # 请求发送最大时间 proxy_read_timeout 90; # 读取最大时间 proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k;
B. 基本配置
使用 proxy_pass属性进行代理,如下配置, 访问 http://localhost:8080/ 将会被代理到 http://localhost:9001/ 上;访问 http://localhost:8090/ 将会被代理到 http://localhost:9002/
代码如下:

worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 8080; server_name localhost; location / { proxy_pass http://localhost:9001; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 8090; server_name localhost; location / { proxy_pass http://localhost:9002; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
二. 配置文件详解
1. 整体说明【重点】
Nginx配置文件一般位于Nginx安装目录下的conf目录下,整个文件以block形式组合而成,每一个block都使用"{}"大括号来表示,block中可以嵌套其他block层级,其中main层是最高层次。
Nginx配置文件主要有4部分,main(全局设置)、server(主机设置)、upstream(上游服务器设置,主要为反向代理,负载均衡相关配置)和location(url匹配特定位置的设置),每部分包含若干指令。
- Main部分的设置影响其他所有部分的设置;
- Server部分主要用于指定虚拟机主机域名,ip和端口;(可以有多个)
- Upstream的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;
- Location部分用于匹配网页位置(如,跟目录“/”,”/images”等)。
它们之间的关系是,server继承main,location继承server,upstream既不会继承指令也不会被继承。
在这四个部分当中,每个部分都包含若干指令,这些指令主要包含Nginx的主模块指令、事件模块指令、HTTP核心模块指令,同时每个部分还可以使用其他HTTP模块指令,例如Http SSL模块、HttpGzip Static模块和Http Addition模块等。
分享一份完整的配置文件:【重点!!】
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
# 实际服务器地址,一般用于反向代理 或 负载均衡
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#alias path #别名目录 (和上面的root根目录只能存在一个)
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}
2. 配置文件的位置
配置文件是一些文本文件,通常位于 nginx安装路径/etc/nginx 或 /etc/nginx ,主配置文件通常命名为 nginx.conf ,为了保持整洁,部分配置可以放到单独的文件中,再自动地被包含到主配置文件,但应该注意的是,nginx目前不支持Apache风格的分布式配置文件(如.htaccess文件),所有和nginx行为相关的配置都应该位于一个集中的配置文件目录中.
可以通过【nginx -t】查看配置文件的位置。
三. 全局详解
1. nginx全局配置说明
user nobody nobody;
worker_processes 2;
error_log logs/error.log notice;
pid logs/nginx.pid;
events{
use epoll;
worker_connections 65536;
}
(1) user
user是个主模块指令,指定Nginx的 Worker进程运行用户以及用户组,默认由nobody账号运行。
这个地方如果写错了就会出现获取不到用户的错误
(2) worker_processes
是个主模块指令,指定了Nginx要开启的进程数,每个Nginx进程平均耗费10M~12M内存,建议指定和CPU的数量一致即可。
这个地方如果配置配置了
worker_processes 2;
那么他的工作进程就有两个
(3) error_log
是个主模块指令,用来定义全局错误日志文件,日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
日志文件路径一般在nginx安装目录的logs目录中
(4) pid
是个主模块指令,用来指定进程pid的存储文件位置。
进行成和nginx的master的进程号是一致的,只有nginx运行时才存在,如果nginx停止了 pid也会被删除掉
2. events事件指令
events事件指令是设定Nginx的工作模式及连接数上限:
user nobody nobody;
worker_processes 2;
error_log logs/error.log notice;
pid logs/nginx.pid;
events{
use epoll;
worker_connections 65536;
}
(1). use
use是个事件模块指令,用来指定Nginx的工作模式. Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll,其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中,对于Linux系统,epoll工作模式是首选。
(2). worker_connections
也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024。
最大客户端连接数由worker_processes和worker_connections决定,即Max_client=worker_processes*worker_connections
在作为反向代理时,max_clients变为:max_clients = worker_processes *worker_connections/4。
进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效
四. http服务器配置详解
http服务配置
http {
# 引入文件类型映射文件
include mime.types;
# 如果没有找到指定的文件类型映射 使用默认配置
default_type application/octet-stream;
# 日志打印格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 启动零拷贝提高性能
sendfile on;
# 设置keepalive长连接超时时间
keepalive_timeout 65;
# 引入子配置文件
include /usr/local/openresty/nginx/conf/conf.d/*.conf;
}
(1) include
include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度,可以将其他各个模块的具体配置分散在不同的文件夹中。
(2) default_type
default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。
(3) log_format
log_format是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用。
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2022-07-05 第一节:JS基础题(数据类型、字符串算法、运算符、判空等)
2020-07-05 第六节:IdentityServer4设备流授权模式和扫码登录(应用于IOT)