Nginx 反向代理是一种常见的应用场景,它允许 Nginx 作为中间服务器接收客户端的请求,并代理转发这些请求到后端的真实服务器。这种配置使得客户端只需要与 Nginx 交互,而后端服务器对客户端是透明的。

ngx_http_proxy_module: 将客⼾端的请求以http协议转发⾄指定服务器进⾏处理。
ngx_stream_proxy_module:将客⼾端的请求以tcp协议转发⾄指定服务器处理。
ngx_http_fastcgi_module:将客⼾端对php的请求以fastcgi协议转发⾄指定服务器助理。
ngx_http_uwsgi_module:将客⼾端对Python的请求以uwsgi协议转发⾄指定服务器处理

实现http反向代理

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        # 设置 HTTP 反向代理,将请求转发到后端服务器
        proxy_pass http://backend_server;

        # 其他反向代理相关配置
        # ...
    }

    # 其他配置
    # ...
}
proxy_pass;
#⽤来设置将客⼾端请求转发给的后端服务器的主机,可以是主机名、IP地址:端⼝的⽅式,也可以代理到预先设置的
主机群组,需要模块gx_http_upstream_module⽀持。
location /web {
index index.html;
proxy_pass http://10.0.7.205:80;
#不带斜线将访问的/web,等于访问后端服务器 http://192.168.7.103:80/web/index.html,即后端服务器配置的站点根⽬录要有web⽬录才可以被访问,这是⼀个追加/web到后端服务器
http://servername:port/WEB/INDEX.HTML的操作
proxy_pass http://10.0.7.205:80/;
#带斜线,等于访问后端服务器的http://192.168.7.103:80/index.html 内容返回给客⼾端
}
proxy_hide_header field;
#⽤于nginx作为反向代理的时候,在返回给客⼾端http响应的时候,隐藏后端服务版本相应头部的信息,可以设置在
http/server或location块,
location /web {
index index.html;
proxy_pass http://10.0.7.205:80/;
proxy_hide_header ETag;
}

proxy_pass_header field;
#默认nginx在响应报⽂中不传递后端服务器的⾸部字段Date, Server, X-Pad, X-Accel等参数,如果要传递的
话则要使⽤ proxy_pass_header field声明将后端服务器返回的值传递给客⼾端。

proxy_pass_request_body on | off;
#是否向后端服务器发送HTTP包体部分,可以设置在http/server或location块,默认即为开启

proxy_pass_request_headers on | off;
#是否将客⼾端的请求头部转发给后端服务器,可以设置在http/server或location块,默认即为开启

proxy_set_header;
#可以更改或添加客⼾端的请求头部信息内容并转发⾄后端服务器,⽐如在后端服务器想要获取客⼾端的真实IP的时
候,就要更改每⼀个报⽂的头部,如下:
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-For $remote_addr;
#添加HOST到报⽂头部,如果客⼾端为NAT上⽹那么其值为客⼾端的共⽤的公⽹IP地址,常⽤于在⽇之中记录客⼾端的
真实IP地址。

proxy_connect_timeout time;
#配置nginx服务器与后端服务器尝试建⽴连接的超时时间,默认为60秒,⽤法如下:
proxy_connect_timeout 60s;
#60s为⾃定义nginx与后端服务器建⽴连接的超时时间

proxy_read_time time;
#配置nginx服务器向后端服务器或服务器组发起read请求后,等待的超时时间,默认60s
proxy_send_time time;
#配置nginx项后端服务器或服务器组发起write请求后,等待的超时时间,默认60s

proxy_http_version 1.0;
#⽤于设置nginx提供代理服务的HTTP协议的版本,默认http 1.0

proxy_ignore_client_abort off;
#当客⼾端⽹络中断请求时,nginx服务器中断其对后端服务器的请求。即如果此项设置为on开启,则服务器会忽略客
⼾端中断并⼀直等着代理服务执⾏返回,如果设置为off,则客⼾端中断后Nginx也会中断客⼾端请求并⽴即记录499⽇
志,默认为off。

proxy_headers_hash_bucket_size 128;
#当配置了 proxy_hide_header和proxy_set_header的时候,⽤于设置nginx保存HTTP报⽂头的hash表的上
限。
proxy_headers_hash_max_size 512;
#设置proxy_headers_hash_bucket_size的最⼤可⽤空间
server_namse_hash_bucket_size 512;
#server_name hash表申请空间⼤⼩
server_names_hash_max_szie 512;
#设置服务器名称hash表的上限⼤⼩

反向代理示例

image.png image.png 指定location image.png image.png image.png

反向代理缓存

proxy_cache zone | off; 默认off
#指明调⽤的缓存,或关闭缓存机制;Context:http, server, location

proxy_cache_key string;
#缓存中⽤于“键”的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;

proxy_cache_valid [code ...] time;
#定义对特定响应码的响应内容的缓存时⻓,定义在http{...}中
⽰例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;

proxy_cache_path;
定义可⽤于proxy功能的缓存;Context:http
proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size
[inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time]
[manager_threshold=time] [loader_files=number] [loader_sleep=time]
[loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time]
[purger_threshold=time];

⽰例:在http配置定义缓存信息
proxy_cache_path /var/cache/nginx/proxy_cache #定义缓存保存路径,proxy_cache会⾃动创建
levels=1:2:2 #定义缓存⽬录结构层次,1:2:2可以⽣成2^4x2^8x2^8=1048576个⽬录
keys_zone=proxycache:20m #指内存中缓存的⼤⼩,主要⽤于存放key和metadata(如:使⽤次数)
inactive=120s; #缓存有效时间
max_size=1g; #最⼤磁盘占⽤空间,磁盘存⼊⽂件内容的缓存空间最⼤值

调⽤缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多⻓时间
proxy_cache_valid any 1m;

proxy_cache_use_stale error http_502 http_503;
#在被代理的后端服务器出现哪种情况下,可直接使⽤过期的缓存响应客⼾端,
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502
| http_503 | http_504 | http_403 | http_404 | off ; #默认是off

proxy_cache_methods GET | HEAD | POST ...;
#对哪些客⼾端请求⽅法对应的响应进⾏缓存,GET和HEAD⽅法总是被缓存

未配置缓存压测 image.png image.png 配置缓存压测 image.pngimage.pngimage.png#要缓存的URL 或者放在server配置项对所有URL都进⾏缓存

image.pngimage.png image.png

添加头部报文信息

在 Nginx 反向代理中,你可以使用 proxy_set_header 指令来添加头部报文信息。这个指令用于在代理请求转发到后端服务器之前,向请求的头部中添加新的字段和值

#添加⾃定义⾸部,如下:
add_header name value [always];
add_header X-Via $server_addr;
add_header X-Cache $upstream_cache_status;
add_header X-Accel $server_name;
#添加⾃定义响应信息的尾部, 1.13.2版后⽀持
add_trailer name value [always];

image.pngimage.png

nginx反向代理多台服务器

http upstream配置参数

upstream name {
} #
⾃定义⼀组服务器,配置在http内
server address [parameters];
#配置⼀个后端web服务器,配置在upstream内,⾄少要有⼀个server服务器配置。
#server⽀持的parameters如下:
weight=number #设置权重,默认为1。
max_conns=number #给当前server设置最⼤活动链接数,默认为0表⽰没有限制。
max_fails=number #对后端服务器连续监测失败多少次就标记为不可⽤。
fail_timeout=time #对后端服务器的单次监测超时时间,默认为10秒。
backup #设置为备份服务器,当所有服务器不可⽤时将重新启⽤次服务器。
down #标记为down状态。
resolve #当server定义的是主机名的时候,当A记录发⽣变化会⾃动应⽤新IP⽽不⽤重启Nginx。
hash KEY consistent;
#基于指定key做hash计算,使⽤consistent参数,将使⽤ketama⼀致性hash算法,适⽤于后端是Cache服务器
(如varnish)时使⽤,consistent定义使⽤⼀致性hash运算,⼀致性hash基于取模运算。
hash $request_uri consistent; #基于⽤⼾请求的uri做hash
ip_hash;
#源地址hash调度⽅法,基于的客⼾端的remote_addr(源地址)做hash计算,以实现会话保持,
least_conn;
#最少连接调度算法,优先将客⼾端请求调度到当前连接最少的后端服务器

image.png image.png image.png

Nginx反向代理IP透传(真实获取客户端ip)

image.png image.pngimage.png

实现负载均衡

在 Nginx 中实现负载均衡可以使用 upstream 模块和相关的负载均衡算法。upstream 模块允许你定义一组后端服务器,并在反向代理的配置中使用这个组来分发请求,从而实现负载均衡。

http {
    upstream backend_servers {
        # 定义后端服务器列表和权重
        server backend1.example.com weight=2;
        server backend2.example.com;
        server backend3.example.com;
    }

    server {
        listen 80;
        server_name yourdomain.com;

        location / {
            # 反向代理到后端服务器组 backend_servers
            proxy_pass http://backend_servers;

            # 其他反向代理相关配置
            # ...
        }

        # 其他配置
        # ...
    }
}

默认情况下,Nginx 使用轮询算法进行负载均衡,即每个请求依次轮流分发给不同的后端服务器。除了轮询算法,Nginx 还支持其他负载均衡算法,例如:

least_conn: 根据当前连接数选择连接数最少的服务器。
ip_hash: 根据客户端 IP 地址进行哈希分配,同一 IP 的请求总是发到同一台服务器。
random: 随机选择一个后端服务器。

upstream backend_servers {
    random;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

实现FastCGI

CGI(Common Gateway Interface)和 FastCGI 都是用于实现 Web 服务器和应用程序之间的通信协议,允许 Web 服务器将请求传递给外部应用程序处理,并将处理后的结果返回给客户端。 CGI(Common Gateway Interface): CGI 是一种早期的 Web 服务器和应用程序通信协议,最早于1993年由NCSA提出并广泛使用。 当客户端发起一个请求时,Web 服务器会将请求传递给指定的 CGI 程序,这个程序可以是任意编程语言编写的可执行文件。 每个请求都会启动一个新的 CGI 进程来处理,并在处理完请求后退出。这种方式效率较低,因为频繁地启动和关闭进程会产生较大的开销。 CGI 应用程序可以与 Web 服务器独立运行,没有对 Web 服务器的依赖,但也导致了频繁的进程创建和销毁。 FastCGI: FastCGI 是对 CGI 协议的改进和扩展,旨在提高 CGI 的性能和效率。 FastCGI 将一个长时间运行的应用程序进程与 Web 服务器保持连接,使得多个请求可以复用同一个进程,避免频繁地启动和关闭进程,从而降低了开销。 FastCGI 应用程序与 Web 服务器之间建立长连接,通过 FastCGI 协议进行通信,可以复用连接来处理多个请求。 FastCGI 提供了更灵活的配置和管理方式,使得 Web 服务器可以更好地控制和管理应用程序的进程池。 多数的 Web 服务器(包括 Nginx 和 Apache)都支持 FastCGI。 对比:

  1. FastCGI 相对于传统的 CGI,性能更高,因为可以复用进程和连接,避免频繁启动和关闭进程的开销。
  2. CGI 应用程序每个请求都会启动一个新的进程,效率较低,特别是在高并发情况下。
  3. FastCGI 应用程序可以保持与 Web 服务器的长连接,并复用进程,更适合处理高并发的请求。
  4. FastCGI 需要对应用程序进行适当的配置和管理,以控制进程池的大小和资源占用。

PHP-FPM(PHP FastCGI Process Manager) 是一个用于处理 PHP 脚本的 FastCGI 进程管理器。它可以与 Nginx、Apache 等 Web 服务器配合使用,提供高性能的 PHP 处理能力,适用于处理动态 PHP 网页请求。 PHP-FPM 的主要特点和优势包括: 1、高性能:PHP-FPM 使用 FastCGI 协议,可以保持长连接并复用进程,避免了频繁启动和关闭 PHP 进程的开销,从而提高了性能。 2、进程管理:PHP-FPM 可以管理 PHP 进程池,根据配置和实际负载自动增减 PHP 进程数量,使得服务器能够更好地适应不同的并发请求。 3、资源限制:PHP-FPM 支持设置每个 PHP 进程的资源限制,包括内存使用、执行时间等,可以防止 PHP 脚本占用过多的资源。 4、进程优先级:PHP-FPM 可以设置 PHP 进程的优先级,让重要的任务优先得到执行。 5、日志记录:PHP-FPM 可以记录 PHP 进程的运行日志,方便排查问题和监控服务器性能。 6、多版本支持:PHP-FPM 支持同时运行多个 PHP 版本,并根据配置选择不同的 PHP 版本来处理请求。

FastCGI配置指令

Nginx基于模块ngx_http_fastcgi_module实现通过fastcgi协议将指定的客⼾端请求转发⾄php-fpm处理,其配置 指令如下:

fastcgi_pass address;
#转发请求到后端服务器,address为后端的fastcgi server的地址,可⽤位置:location, if in location
fastcgi_index name;
#fastcgi默认的主⻚资源,⽰例:fastcgi_index index.php;
fastcgi_param parameter value [if_not_empty];
#设置传递给FastCGI服务器的参数值,可以是⽂本,变量或组合,可⽤于将Nginx的内置变量赋值给⾃定义key
fastcgi_param REMOTE_ADDR $remote_addr; #客⼾端源IP
fastcgi_param REMOTE_PORT $remote_port; #客⼾端源端⼝
fastcgi_param SERVER_ADDR $server_addr; #请求的服务器IP地址
fastcgi_param SERVER_PORT $server_port; #请求的服务器端⼝
fastcgi_param SERVER_NAME $server_name; #请求的server name
fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size
[inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time]
[manager_threshold=time] [loader_files=number] [loader_sleep=time]
[loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time]
[purger_threshold=time];
定义fastcgi的缓存;
path #缓存位置为磁盘上的⽂件系统路径
max_size=size #磁盘path路径中⽤于缓存数据的缓存空间上限
levels=levels:#⼗六进制的缓存⽬录的层级数量,以及每⼀级的⽬录数量,levels=ONE:TWO:THREE,⽰例:leves=1:2:2
keys_zone=name:size #设置缓存名称及k/v映射的内存空间的名称及⼤⼩
inactive=time #缓存有效时间,默认10分钟,需要在指定时间满⾜fastcgi_cache_min_uses 次数被视为活动缓存。
fastcgi_cache zone | off;
#调⽤指定的缓存空间来缓存数据,可⽤位置:http, server, location
fastcgi_cache_key string;
#定义⽤作缓存项的key的字符串,⽰例:fastcgi_cache_key $request_uri;
fastcgi_cache_methods GET | HEAD | POST ...;
#为哪些请求⽅法使⽤缓存
fastcgi_cache_min_uses number;
#缓存空间中的缓存项在inactive定义的⾮活动时间内⾄少要被访问到此处所指定的次数⽅可被认作活动项
fastcgi_keep_conn on | off;
#收到后端服务器响应后,fastcgi服务器是否关闭连接,建议启⽤⻓连接
fastcgi_cache_valid [code ...] time;
#不同的响应码各⾃的缓存时⻓
fastcgi_hide_header field; #隐藏响应头指定信息
fastcgi_pass_header field; #返回响应头指定信息,默认不会将Status、X-Accel-...返回
配置fastcgi

1、安装php-fpm

yum install php-fpm

2、修改php-fpm配置参数

vim /etc/php-fpm.d/www.conf
listen = 10.0.7.201:9000
;listen.allowed_clients = 127.0.0.1

image.png 3、准备php测试页面

mkdir /apps/php -p

image.png 4、配置nginx转发 image.pngimage.pngimage.pngimage.png

tengine使用

Tengine 是由淘宝网发起的一个高性能的 Web 服务器项目,它是在 Nginx 基础上进行优化和扩展的。Tengine 的目标是提供更好的性能和更多的功能,适用于高并发的 Web 环境。 Tengine 项目主要关注以下几个方面的优化: 高性能:Tengine 在 Nginx 的基础上进行了一系列性能优化,包括事件模型、线程池、内存池等,以提高请求处理能力和并发连接数。 内置模块:Tengine 集成了一些内置模块,提供了更多的功能扩展,例如 HTTP upstream keepalive、cookie log、accesskey 等模块。 支持 Lua 脚本:Tengine 支持通过 Lua 脚本来扩展和定制功能,让用户能够更灵活地定制处理流程。 安全性:Tengine 关注 Web 服务器的安全性,提供了一些安全相关的功能和选项,如限制请求大小、限制请求频率等。 管理工具:Tengine 提供了一些管理工具,方便用户进行配置和监控,如 tengine-manager 和 ngx_debug 工具。 编译安装 Tengine 可以通过以下步骤来完成: 编译安装tengine 下载 Tengine 源代码: 首先,你需要从 Tengine 的官方网站或 GitHub 上下载最新的源代码。可以使用 git 命令来获取最新的代码:

git clone https://github.com/alibaba/tengine.git
cd tengine

或者你也可以从官方网站下载源代码,并解压到合适的目录。 安装依赖项: 在编译 Tengine 之前,你需要确保系统中已经安装了一些必要的依赖项,如 GCC 编译器和 PCRE 库。在 Ubuntu 系统上,你可以使用以下命令安装:

sudo apt update
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev

其他 Linux 发行版可以使用相应的包管理工具来安装依赖项。 配置编译选项: 进入 Tengine 源代码目录后,你可以使用 ./configure 命令来配置编译选项。这里你可以根据需要添加或删除一些选项。例如,指定安装目录,添加额外的模块,启用或禁用特定的功能等。

./configure --prefix=/usr/local/tengine

编译和安装: 配置完成后,你可以使用 make 命令编译 Tengine:

make
sudo make install

配置 Tengine: 安装完成后,你需要根据需要编辑 Tengine 的配置文件,并启动 Tengine 服务。主要的配置文件是 conf/nginx.conf,你可以根据实际情况进行修改。 启动 Tengine: 编辑好配置文件后,可以使用以下命令启动 Tengine:

/usr/local/tengine/sbin/nginx

如果希望以后台模式运行,可以使用 -c 参数指定配置文件,并加上 -g 'daemon off;' 参数来启动:

/usr/local/tengine/sbin/nginx -c /path/to/nginx.conf -g 'daemon off;'

以上是 Tengine 的编译安装过程。根据不同的需求,你可能需要根据实际情况进行配置和定制。同时,确保你已经熟悉了 Tengine 的配置选项和功能,以便充分发挥其性能和功能优势。 加载动态模块concat 在 Nginx 或 Tengine 中,concat 模块用于合并多个静态文件为一个单一的文件,从而减少 HTTP 请求次数,提高网页加载速度。通常在前端优化中,将多个 CSS 或 JavaScript 文件合并为一个文件是一种常见的优化手段,这样可以减少客户端浏览器与服务器之间的往返次数,加快网页加载速度。

1、安装tengine先不打开concat:
# ./configure --prefix=/apps/tengine --with-http_ssl_module --with-http_v2_module --
with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module -
-with-pcre --with-file-aio
2、通过动态模块实现concat功能:
http://tengine.taobao.org/document_cn/dso_cn.html
#yum install lua lua-devel
#./configure --prefix=/apps/tengine --with-http_ssl_module --with-http_v2_module --
with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module -
-with-pcre --with-file-aio --with-http_concat_module=shared --withhttp_lua_module=shared
vim /apps/tenginx/conf/nginx.conf
dso {
load ngx_http_lua_module.so;
load ngx_http_concat_module.so;
}

image.png