Nginx是一个高性能、高并发的Web服务器和反向代理服务器,它是自由软件,可以在多种操作系统上运行。它的轻量级设计使得它在高流量的Web应用场景下表现出色,而且它的模块化架构使得它可以非常灵活地满足各种需求。
本文将介绍如何在Linux系统上编译安装Nginx,并配置支持基于cookie的负载均衡。
首先,我们需要从官网(http://nginx.org)下载最新版的Nginx源码包,并将其解压到一个目录中。我们假设解压后的目录名为nginx-1.20.1。
在编译Nginx之前,我们需要安装一些必要的依赖包。在Ubuntu或Debian系统上,可以使用以下命令安装:
sudo apt-get update
sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g-dev libssl-dev
如果你使用的是其他Linux发行版,需要使用相应的包管理器安装这些依赖包。
进入nginx-1.20.1目录,运行以下命令进行配置:
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_realip_module --with-http_stub_status_module --with-stream --with-stream_ssl_module --with-stream_realip_module --with-stream_ssl_preread_module --with-stream_geoip_module=dynamic --with-pcre --with-pcre-jit --with-zlib --with-openssl-opt=no-nextprotoneg --with-debug --add-module=../nginx-cookie-flag-module-master
其中,--prefix参数指定Nginx安装目录为/usr/local/nginx,--with-http_ssl_module启用HTTPS支持,--with-http_realip_module启用X-Real-IP和X-Forwarded-For支持,--with-http_stub_status_module启用nginx状态页面,--with-stream启用stream模块,--with-stream_ssl_module启用stream的HTTPS支持,--with-stream_realip_module启用stream的X-Real-IP和X-Forwarded-For支持,--with-stream_ssl_preread_module启用stream的TLS协商,--with-stream_geoip_module=dynamic启用stream的GeoIP模块,--with-pcre启用PCRE正则表达式库,--with-pcre-jit启用PCRE的Just-In-Time编译优化,--with-zlib启用zlib库,--with-openssl-opt=no-nextprotoneg禁用Next Protocol Negotiation协议扩展,--with-debug启用调试模式,--add-module指定nginx-cookie-flag-module的源码目录,用于支持基于cookie的负载均衡。
运行以下命令进行编译和安装:
make && sudo make install
Nginx安装完成后,需要进行配置
在/usr/local/nginx/conf目录下创建一个新的文件,命名为nginx.conf,并输入以下内容:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /usr/local/nginx/conf/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"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
include /usr/local/nginx/conf/sites-enabled/*;
}
在上面的配置文件中,我们使用了include指令包含了一个目录下的所有配置文件。现在,我们需要在该目录下创建一个新的文件,命名为my_load_balancer.conf,并输入以下内容:
upstream backend {
server backend1.example.com:80;
server backend2.example.com:80;
}
server {
listen 80;
server_name myloadbalancer.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Set cookie flag to mark the request as sticky
add_header Set-Cookie "nginx=1; path=/; domain=myloadbalancer.example.com; HttpOnly; SameSite=Lax";
}
# Handle requests without cookies by redirecting to the same URL with a cookie
if ($http_cookie !~* "nginx") {
rewrite ^(.*)$ /$1?cookie redirect;
}
}
在上面的配置中,我们定义了一个名为backend的upstream组,其中包含了两个后端服务器的地址和端口。我们还定义了一个名为myloadbalancer.example.com的虚拟主机,并将其绑定到80端口。在该虚拟主机的location配置块中,我们使用了proxy_pass指令将请求代理到backend组中的服务器,并设置了一些代理头。最后,我们使用add_header指令将cookie标记为“sticky”,以便负载均衡器可以记住用户的请求并将其发送到同一后端服务器。
如果请求不包含cookie,则使用rewrite指令将其重定向到同一URL,并在URL后附加cookie参数。
现在,我们可以使用以下命令启动Nginx:
sudo /usr/local/nginx/sbin/nginx
在启动成功后,可以使用以下命令检查Nginx的运行状态:
sudo /usr/local/nginx/sbin/nginx -t
如果输出类似于以下内容,则表示Nginx配置文件正确,可以正常运行:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
现在我们可以通过发送一些请求来测试我们的基于cookie的负载均衡器是否正常工作。假设我们已经将DNS记录配置为将myloadbalancer.example.com解析到负载均衡器的IP地址上。
可以使用curl命令来测试我们的负载均衡器。首先,发送一个请求到负载均衡器的IP地址:
curl http://myloadbalancer.example.com/
在第一次请求时,我们应该会收到一个Set-Cookie响应头,其中包含了一个名为nginx的cookie值。这意味着负载均衡器已经选择了一个后端服务器,并将该cookie发送给了客户端,以便在将来的请求中使用该cookie。
现在,我们可以再次发送请求到负载均衡器,并包含之前收到的cookie:
curl --cookie "nginx=1" http://myloadbalancer.example.com/
如果一切正常,请求将被发送到同一后端服务器,因为我们已经使用了“sticky”cookie来告诉负载均衡器记住客户端的请求,并将其发送到同一后端服务器。
如果我们发送一个不包含cookie的请求到负载均衡器,我们应该会看到该请求被重定向到相同的URL,但是附带了一个cookie参数:
curl http://myloadbalancer.example.com/
如果一切正常,我们应该会收到一个302重定向响应,并且重定向URL应该包含一个名为nginx的cookie参数。
我们可以通过多次发送请求来测试我们的基于cookie的负载均衡器是否正常工作。我们可以使用不同的cookie值来模拟来自不同用户的请求,并观察请求是否被正确地路由到同一后端服务器。