nginx 中文文档:https://blog.redis.com.cn/doc/
Nginx 正向代理与反向代理的区别
正向代理:文章源自十年又十年-https://www.bbigsun.com/67.html
如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理,下面是正向代理的原理图。文章源自十年又十年-https://www.bbigsun.com/67.html
由于工作环境原因,日常工作只能局限于单位的局域网,如果想要访问互联网,怎么办呢?这就需要用到正向代理。(VPN 也是一种正向代理)文章源自十年又十年-https://www.bbigsun.com/67.html
文章源自十年又十年-https://www.bbigsun.com/67.html
反向代理:文章源自十年又十年-https://www.bbigsun.com/67.html
看下面原理图,就一目了然。其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP地址。文章源自十年又十年-https://www.bbigsun.com/67.html
文章源自十年又十年-https://www.bbigsun.com/67.html
正向代理和反向代理的区别,一句话就是:如果我们客户端自己用,就是正向代理。如果是在服务器用,用户无感知,就是反向代理。文章源自十年又十年-https://www.bbigsun.com/67.html
Nginx 配置文件
Nginx 默认配置文件位于安装目录下的 conf 目录下(nginx.conf)。文章源自十年又十年-https://www.bbigsun.com/67.html
Nginx 配置文件可以分为三部分:全局块,events块,http块。文章源自十年又十年-https://www.bbigsun.com/67.html
## 全局块
#
# 主进程(master),负责管理子进程(worker)
# worker_processes :表示开启 n 个业务进程(默认为1)
#
worker_processes 1;
## events块
#
events {
worker_connections 1024;
}
## http块
#
http {
# include :引入其他文件,此处表示引入 http mime 类型
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
## server块 :虚拟主机,可以配置多个
#
server {
listen 80;
server_name localhost;
## location块
#
location / {
# 路径匹配之后,哪个目录下去匹配相应的网页,html 是相对路径
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
配置反向代理:实例一
使用 Nginx 反向代理,访问 www.example.com(默认监听80端口) 跳转到 127.0.0.1:8080
server {
listen 80;
server_name www.example.com;
# root 与 proxy_pass 选项不能同时生效,二选一执行。
location / {
root html;
index index.html index.htm;
proxy_pass http://127.0.0.1:8080
}
}
配置反向代理:实例二
使用 Nginx 反向代理,根据访问的路径跳转到不同端口的服务中,监听端口为 9000
- 访问 www.example.com/one 跳转到 127.0.0.1:8081
- 访问 www.example.com/two 跳转到 127.0.0.1:8082
server {
listen 9000;
server_name www.example.com;
location ~ /one/ {
proxy_pass http://127.0.0.1:8081
}
location ~ /two/ {
proxy_pass http://127.0.0.1:8082
}
}
location 指令说明
location [ = | ~ | ~* | ^~] uri {
}
该指令用于匹配 url:
=
:用于不含正则表达式的 url 前,要求请求字符串与 url 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求~
:用于表示 url 包含正则表达式,并且区分大小写~*
:用于表示 url 包含正则表达式,并且不区分大小写^~
:用于不含正则表达式的 url 前,要求 Nginx 服务器找到标识 url 和请求。字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location块中的正则 url 和请求字符串做匹配。
配置负载均衡
http {
upstream myapp1 {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name xiaogd.net;
location / {
proxy_pass http://myapp1;
}
}
}
如果两台 tomcat 主机的配置不同, 比如一台的性能更强劲些, 还可以调整负载的比例(即权重, weight), 让性能更强的一台承担更多的请求:
如下配置 3:2 的权重比, 让其中一台承担 60% 的请求, 而另一台性能较差的则承担 40%, 也即每 5 个请求, 3 个会被转到 ip 为 20 的主机上, 2 个会转到 ip 为 21 的主机上。
http {
upstream myapp1 {
server 192.168.0.20:8080 weight=3;
server 192.168.0.21:8080 weight=2;
}
server {
listen 80;
server_name xiaogd.net;
location / {
proxy_pass http://myapp1;
}
}
}
worker_processes 与 worker_connections 如何设置?
一般一个进程足够了,你可以把连接数设得很大。(worker_processes: 1,worker_connections: 10,000)
如果有SSL、gzip这些比较消耗CPU的工作,而且是多核CPU的话,可以设为和CPU的数量一样。(worker_processes: CPU核心数)
或者要处理很多很多的小文件,而且文件总大小比内存大很多的时候,也可以把进程数增加,以充分利用IO带宽(主要似乎是IO操作有 block)
worker_processes,工作进程数
- 默认:worker_processes: 1
- 调大:worker_processes: CPU核心数,(双核4线程,可以设置为4)
worker_connections,单个工作进程可以允许同时建立外部连接的数量,数字越大,能同时处理的连接越多
- 默认:worker_connections: 1024
- 调大:worker_connections: 100000,(调大到10万连接)
worker_connections 解析
- connections不是随便设置的,而是与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”。
- 内存:每个连接数分别对应一个read_event、一个write_event事件,一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节,通过数学公式可以算出100000个连接数大概会占用 31M = 100000 * 328 / 1024 / 1024,当然这只是nginx启动时,connections连接数所占用的nginx。
- 进程最大可打开文件数:进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024,现在是65535,nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如: worker_rlimit_nofile 20960; 设置ulimits:ulimit -SHn 65535
纸上得来终觉浅,绝知此事要躬行。
评论