Nginx 笔记


Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。
Nginx 是一款轻量级的、高性能的 HTT P的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在 BSD-like 协议下发行。其特点是占有内存少,并发能力强,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数,事实上 nginx 的并发能力在同类型的网页服务器中表现较好。
Nginx 支持热部署,启动简单,可以做到 7*24 不间断运行。几个月都不需要重新启动。

Nginx 的反向代理(扩展:正向代理)

首先,看一张关于正向代理和反向代理的图片
[正向代理和反向代理.png]
在这里,用通俗易懂的方式解释一下:

正向代理

正向代理是代理了客户端
正向代理,就是客户端将自己的请求率先发给代理服务器,通过代理服务器将请求转发给服务器。我们常用的VPN就是一种代理服务器,为了可以连上国外的网站,客户端需要使用一个可以连接外网的服务器作为代理,并且客户端能够连接上该代理服务器。
[正向代理.png]

反向代理

反向代理则是代理服务器端。
在有多台服务器分布的情况下,为了能让客户端访问到的IP地址都为同一个网站,就需要使用反向代理。
比如:我们访问淘宝的时候,淘宝内部肯定不是只有一台服务器,它的内部有很多台服务器,那我们进行访问的时候,因为服务器中间 session 不共享,那我们是不是在服务器之间访问需要频繁登录,那这个时候淘宝搭建一个过渡服务器,对我们是没有任何影响的,我们是登录一次,但是访问所有,这种情况就是 反向代理。对我们来说,客户端对代理是无感知的,客户端不需要任何配置就可以访问,我们只需要把请求发送给反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的地址。(在服务器中配置代理服务器)
[反向代理.png]

Nginx的负载均衡

什么是负载均衡?

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
简单来说就是:现有的请求使服务器压力太大无法承受,所有我们需要搭建一个服务器集群,去分担原先一个服务器所承受的压力,那现在我们有 ABCD 等等多台服务器,我们需要把请求分给这些服务器,但是服务器可能大小也有自己的不同,所以怎么分?如何分配更好?又是一个问题。

Nginx 给出来三种关于负载均衡的方式:

轮询法(默认方法)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down掉,能自动剔除。
适合服务器配置相当,无状态且短平快的服务使用。也适用于图片服务器集群和纯静态页面服务器集群

weight 权重模式(加权轮询)

指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。
这种方式比较灵活,当后端服务器性能存在差异的时候,通过配置权重,可以让服务器的性能得到充分发挥,有效利用资源。weight 和访问比率成正比,用于后端服务器性能不均的情况。权重越高,在被访问的概率越大

ip_hash

上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
我们可以采用 ip_hash 指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。

Nginx 的动静分离

Nginx 的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。动静分离技术其实是采用代理的方式,在 server{} 段中加入带正则匹配的 location 来指定匹配项针对 PHP 的动静分离:静态页面交给 Nginx 处理,动态页面交给 PHP-FPM 模块或 Apache 处理。在 Nginx 的配置中,是通过 location 配置段配合正则匹配实现静态与动态页面的不同处理方式
目前,通过使用 Nginx 大大提高了网站的响应速度,优化了用户体验,让网站的健壮性更上一层楼!
[Nginx的动静分离.png]

Nginx常用命令

cd /usr/local/nginx/sbin/
./nginx  启动
./nginx -s stop  停止
./nginx -s quit  安全退出
./nginx -s reload  重新加载配置文件  如果我们修改了配置文件,就需要重新加载。
ps aux|grep nginx  查看nginx进程

Nginx的安装

Nginx 的跨平台的,因此,在任何平台都是可以下载的。
上传tar包至服务器后,解压到当前目录

tar -zwxf nginx-xxxx.tar.gz

进入解压后的目录,执行configure脚本

cd nginx-xxxx
./configure

使用make命令进行安装

make&&make install

安装完成后,使用whereis命令查找Nginx的安装位置 (默认安装在/user/local/目录下)

whereis ngins

Nginx启动时通常会使用默认设置, 使用如下命令可以让自己的配置文件生效。

# 删除/etc/nginx/sites-available/目录下默认自定义配置
sudo rm -rf /etc/nginx/sites-available/default

# sites-available目录下新建自定义配置文件,可以1个网站1个
sudo nano /etc/nginx/sites-available/myapp1

# 与sites-enabled目录建立软链,可让自定义配置文件生效
sudo ln -s /etc/nginx/sites-available/myapp1 /etc/nginx/sites-enabled

# 检查nginx配置文件是否有问题
sudo systemctl nginx –t

# 重启nginx服务
sudo systemctl nginx restart

注意:如何连接不上,检查阿里云安全组是否开放端口,或者服务器防火墙是否开放端口!
相关命令:

# 开启service firewalld start
# 重启service firewalld restart
# 关闭service firewalld stop
# 查看防火墙规则firewall-cmd --list-all
# 查询端口是否开放firewall-cmd --query-port=8080/tcp
# 开放80端口firewall-cmd --permanent --add-port=80/tcp
# 移除端口firewall-cmd --permanent --remove-port=8080/tcp#重启防火墙(修改配置后要重启防火墙)firewall-cmd --reload
# 参数解释1、firwall-cmd:是Linux提供的操作firewall的一个工具;2、--permanent:表示设置为持久;3、--add-port:标识添加的端口;

Nginx 配置文件

Nginx 配置文件构成

...              # 全局块

events {         # events块
   ...
}

http      # http块
{
    ...   # http全局块
    server        # server块
    { 
        ...       # server全局块
        location [PATTERN]   # location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     # http全局块
}
  • Nginx配置文件通常包含3个模块:
    • 全局块:比如工作进程数,定义日志路径;
    • Events块:设置处理轮询事件模型,每个工作进程最大连接数及http层的keep-alive超时时间;
    • http块:路由匹配、静态文件服务器、反向代理、负载均衡等。

Nginx 配置文件示例

 # 全局块
 user www-data;
 worker_processes  2;  ## 默认1,一般建议设成CPU核数1-2倍
 error_log  logs/error.log; ## 错误日志路径
 pid  logs/nginx.pid; ## 进程id
 
 # Events块
 events {
   # 使用epoll的I/O 模型处理轮询事件。
   # 可以不设置,nginx会根据操作系统选择合适的模型
   use epoll;
   # 工作进程的最大连接数量, 默认1024个
   worker_connections  2048;
   # http层面的keep-alive超时时间
   keepalive_timeout 60;
   # 客户端请求头部的缓冲区大小
   client_header_buffer_size 2k;
 }
 
 # http块
 http { 
   include mime.types;  # 导入文件扩展名与文件类型映射表
   default_type application/octet-stream;  # 默认文件类型
   # 日志格式及access日志路径
   log_format   main '$remote_addr - $remote_user [$time_local]  $status '
     '"$request" $body_bytes_sent "$http_referer" '
     '"$http_user_agent" "$http_x_forwarded_for"';
   access_log   logs/access.log  main;
   # 允许sendfile方式传输文件,默认为off。
   sendfile     on;
   tcp_nopush   on; # sendfile开启时才开启。
 
   # http server块
   # 简单反向代理
   server {
     listen       80;
     server_name  domain2.com www.domain2.com;
     access_log   logs/domain2.access.log  main;
    
     # 转发动态请求到web应用服务器
     location / {
       proxy_pass      http://127.0.0.1:8000;
       deny 192.24.40.8;  # 拒绝的ip
       allow 192.24.40.6; # 允许的ip   
     }
     
     # 错误页面
     error_page   500 502 503 504  /50x.html;
         location = /50x.html {
             root   html;
         }
   }
 
   # 负载均衡
   upstream backend_server {
     server 192.168.0.1:8000 weight=5; # weight越高,权重越大
     server 192.168.0.2:8000 weight=1;
     server 192.168.0.3:8000;
     server 192.168.0.4:8001 backup; # 热备
   }
 
   server {
     listen          80;
     server_name     big.server.com;
     access_log      logs/big.server.access.log main;
     
     charset utf-8;
     client_max_body_size 10M; # 限制用户上传文件大小,默认1M
 
     location / {
       # 使用proxy_pass转发请求到通过upstream定义的一组应用服务器
       proxy_pass      http://backend_server;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $http_host;
       proxy_redirect off;
       proxy_set_header X-Real-IP  $remote_addr;
     }
     
   }
 }
########### 每个指令必须有分号结束。#################
#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;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

Nginx Location/server 配置

Nginx Location 配置是 Nginx 的核心配置,它负责匹配请求的 ur, 并根据 Location 里定义的规则来处理这个请求,比如拒绝、转发、重定向或直接提供文件下载。

URL 匹配方式及优先级

Nginx 的 Location 配置支持普通字符串匹配和正则匹配,不过url的各种匹配方式是有优先级的,如下所示:

  • 匹配符 匹配规则 优先级逐级降低
    • = 精确匹配 1
    • ^~ 以某个字符串开头 2
    • ~ 区分大小写的正则匹配 3
    • ~* 不区分大小写的正则匹配 4
    • !~ 区分大小写的不匹配正则 5
    • !~* 不区分大小写的不匹配正则 6
    • / 通用匹配,任何请求都会匹配到 7
      如下一个例子。由于规则 2 的优先级更高,当用户访问 /static/ 或则 /static/123.html 时,Nginx 会优先执行规则2里的操作,其它的的请求则会交由规则1执行。
 # 规则1:通用匹配
 location / {
 }
 
 # 规则2:处理以/static/开头的url
 location ^~ /static {                         
     alias /usr/share/nginx/html/static; # 静态资源路径
 }

上例中我们使用了 alias 别名设置了静态文件所在目录,我们还可以使用 root 指定静态文件目录。这里请一定注意 alias 和 root 的区别:

  • root 对路径的处理:root 路径 + location 路径
  • alias 对路径的处理:使用 alias 路径替换 location 路径
    如果用 root 设置静态文件资源路径,可以按如下代码设置。两者是等同的。
 # 规则2:处理以/static/开头的url
 location ^~ /static {                         
     root /usr/share/nginx/html; # 静态资源路径
 }

Location 还支持正则匹配,比如下例可以禁止用户访问所有的图片格式文件。

 # 拒绝访问所有图片格式文件
 location ~* .*\.(jpg|gif|png|jpeg)$ {
         deny all;
 }

请求转发和重定向

另一个我们在 Location 块里经常配置的就是转发请求或重定向,如下例所示:

 # 转发动态请求
 server {  
     listen 80;                                                         
     server_name  localhost;                                               
     client_max_body_size 1024M;
 
     location / {
         proxy_pass http://localhost:8080;   
         proxy_set_header Host $host:$server_port;
     }
 }
 
 # http请求重定向到https请求
 server {
     listen 80;
     server_name Domain.com;
     return 301 https://$server_name$request_uri;
 }

无论是转发请求还是重定向,我们都使用了以 $ 符号开头的变量,这些都是 Nginx 提供的全局变量。它们的具体含义如下所示:

 $args, 请求中的参数;
 $content_length, HTTP请求信息里的"Content-Length";
 $content_type, 请求信息里的"Content-Type";
 $document_root, 针对当前请求的根路径设置值;
 $document_uri, 与$uri相同;
 $host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
 $limit_rate, 对连接速率的限制;
 $request_method, 请求的方法,比如"GET"、"POST"等;
 $remote_addr, 客户端地址;
 $remote_port, 客户端端口号;
 $remote_user, 客户端用户名,认证用;
 $request_filename, 当前请求的文件路径名
 $request_body_file,当前请求的文件
 $request_uri, 请求的URI,带查询字符串;
 $query_string, 与$args相同;
 $scheme, 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
 $server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";
 $server_addr, 服务器地址;
 $server_name, 请求到达的服务器名;
 $server_port, 请求到达的服务器端口号;
 $uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。

知道这些全局变量的含义后,我们就可以限制用户的请求方法。比如下例中配置了只允许用户通过 GET 或 POST 方法访问,其他的请求方法则返回405。

 if ($request_method !~ ^(GET|POST)$ ) { return 405; }

Nginx 静态文件配置

Nginx 可直接作为强大的静态文件服务器使用,支持对静态文件进行缓存还可以直接将 Nginx 作为文件下载服务器使用。

静态文件缓存

缓存可以加快下次静态文件加载速度。我们很多与网站样式相关的文件比如 css 和 js 文件一般不怎么变化,缓存有效器可以通过 expires 选项设置得长一些。

     # 使用 expires 选项开启静态文件缓存,10天有效
     location ~ ^/(images|javascript|js|css|flash|media|static)/  {
       root    /var/www/big.server.com/static_files;
       expires 10d;
     }

静态文件压缩

Nginx 可以对网站的 css、js 、xml、html 文件在传输前进行压缩,大幅提高页面加载速度。经过 Gzip 压缩后页面大小可以变为原来的30%甚至更小。使用时仅需开启 Gzip 压缩功能即可。你可以在 http 全局块或 server 块增加这个配置。

 http {
     # 开启gzip压缩功能
     gzip on;

     # 设置允许压缩的页面最小字节数; 这里表示如果文件小于10k,压缩没有意义.
     gzip_min_length 10k; 

     # 设置压缩比率,最小为1,处理速度快,传输速度慢;
     # 9为最大压缩比,处理速度慢,传输速度快; 推荐6
     gzip_comp_level 6; 

     # 设置压缩缓冲区大小,此处设置为16个8K内存作为压缩结果缓冲
     gzip_buffers 16 8k; 

     # 设置哪些文件需要压缩,一般文本,css和js建议压缩。图片视需要要锁。
     gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 
 }

文件下载服务器

Nginx 也可直接做文件下载服务器使用,在 location 块设置 autoindex 相关选项即可。

 server {
 
     listen 80 default_server;
     listen [::]:80 default_server;
     server_name  _;
     
     location /download {    
         # 下载文件所在目录
         root /usr/share/nginx/html;
         
         # 开启索引功能
         autoindex on;  
         
         # 关闭计算文件确切大小(单位bytes),只显示大概大小(单位kb、mb、gb)
         autoindex_exact_size off; 
         
         #显示本机时间而非 GMT 时间
         autoindex_localtime on;   
                 
         # 对于txt和jpg文件,强制以附件形式下载,不要浏览器直接打开
         if ($request_filename ~* ^.*?\.(txt|jpg|png)$) {
             add_header Content-Disposition 'attachment';
         }
     }
 }

Nginx 配置 HTTPS

 # 负载均衡,设置 HTTPS
 upstream backend_server {
     server APP_SERVER_1_IP;
     server APP_SERVER_2_IP;
 }
 
 # 禁止未绑定域名访问,比如通过ip地址访问
 # 444:该网页无法正常运作,未发送任何数据
 server {
     listen 80 default_server;
     server_name _;
     return 444;
 }
 
 # HTTP请求重定向至HTTPS请求
 server {
     listen 80;
     listen [::]:80;
     server_name your_domain.com;
     
     location / {
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_set_header Host $http_host;
         proxy_redirect off;
         proxy_pass http://backend_server; 
      }
     
     return 301 https://$server_name$request_uri;
 }
 
 server {
     listen 443 ssl http2;
     listen [::]:443 ssl http2;
     server_name your_domain.com;
 
     # ssl证书及密钥路径
     ssl_certificate /path/to/your/fullchain.pem;
     ssl_certificate_key /path/to/your/privkey.pem;
 
     # SSL会话信息
     client_max_body_size 75MB;
     keepalive_timeout 10;
 
     location / {
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header X-Forwarded-Proto $scheme;
         proxy_set_header Host $http_host;
         proxy_redirect off;
         proxy_pass http://django; # Django+uwsgi不在本机上,使用代理转发
     }
}

Nginx 日志配置

Nginx 的日志主要包括访问日志 access_log 和错误日志 error_log,你还可以通过 log_format 定义日志格式。你可以在全局块,Server 块或 Location块定义日志。比如下例在 http 块中定义了一个名为 main 的日志格式,所有站点的日志都会按这个格式记录。

 http {
  # 日志格式及access日志路径
   log_format main '$remote_addr - $remote_user [$time_local]  $status '
     '"$request" $body_bytes_sent "$http_referer" '
     '"$http_user_agent" "$http_x_forwarded_for"';
   access_log   logs/access.log  main;
 }

access_log 文件随着访问记录增多有可能变得非常大,我们可以使用 access_log off 关闭一些不需要记录的访问。比如当一个站点没有设置 favicon.ico 时,access_log 会记录了大量 favicon.ico 404 信息, 这是没有必要的, 可以按如下方式关闭访问日志记录。

 location = /favicon.ico {
   log_not_found off; 
   access_log off; # 不在access_log记录该项访问
 }

Nginx 超时设置

Nginx 提供了很多超时设置选项,目的是保护服务器资源,CPU,内存并控制连接数。你可以根据实际项目需求在全局块、Server 块和 Location块进行配置。

请求超时设置
# 客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接。
keepalive_timeout 60;

# 设置请求头的超时时间,可以设置低点。
# 如果超过这个时间没有发送任何数据,nginx将返回request time out的错误。
client_header_timeout 15;

# 设置请求体的超时时间,可以设置低点。
# 如果超过这个时间没有发送任何数据,nginx将返回request time out的错误。
client_body_timeout 15;

# 响应客户端超时时间
# 如果超过这个时间,客户端没有任何活动,nginx关闭连接。
send_timeout 15;

# 上传文件大小限制
client_max_body_size 10m;

# 也是防止网络阻塞,不过要包涵在keepalived参数才有效。
tcp_nodelay on;

# 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置。
# 一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于1k
client_header_buffer_size 2k;

# 这个将为打开文件指定缓存,默认是没有启用的。
# max指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=102400 inactive=20s;

# 这个是指多长时间检查一次缓存的有效信息。
open_file_cache_valid 30s;

# 告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。
reset_timedout_connection on;
Proxy 反向代理超时设置
# 该指令设置与upstream服务器的连接超时时间,这个超时建议不超过75秒。
proxy_connect_timeout 60;

# 该指令设置应用服务器的响应超时时间,默认60秒。
proxy_read_timeout 60;

# 设置了发送请求给upstream服务器的超时时间
proxy_send_timeout 60;

# max_fails设定Nginx与upstream服务器通信的尝试失败的次数。
# 在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用。

upstream big_server_com {
server 192.168.0.1:8000 weight=5  max_fails=3 fail_timeout=30s; # weight越高,权重越大
server 192.168.0.2:8000 weight=1  max_fails=3 fail_timeout=30s;
server 192.168.0.3:8000;
server 192.168.0.4:8001 backup; # 热备
}

Nginx 负载均衡

Nginx 提供了多种负载均衡算法, 最常见的有5种。我们只需修改对应 upstream 模块即可。

轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除;

 # 轮询,大家权重一样
 upstream backend_server {
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
    server 192.168.0.3:8000 down; # 不参与负载均衡
    server 192.168.0.4:8001 backup; # 热备
 }
 
 server {
    listen          80;
    server_name     big.server.com;
    access_log      logs/big.server.access.log main;
     
    charset utf-8;
    client_max_body_size 10M; # 限制用户上传文件大小,默认1M
 
    location / {
      # 使用proxy_pass转发请求到通过upstream定义的一组应用服务器
      proxy_pass      http://backend_server;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_set_header X-Real-IP  $remote_addr;
    }

权重(weight)

通过 weight 指定轮询几率,访问比率与 weight 成正比,常用于后端服务器性能不均的情况。不怎么忙的服务器可以多承担些任务。

 # 权重,weight越大,承担任务越多
 upstream backend_server {
    server 192.168.0.1:8000 weight=3;
    server 192.168.0.2:8000 weight=1;
 }

iip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。

 # 权重,weight越大,承担任务越多
 upstream backend_server {
    ip_hash;
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
 }

url_hash

按访问 url 的 hash 结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

 # URL Hash
 upstream backend_server {
    hash $request_uri;
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
 }

fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。使用这个算法需要安装 nginx-upstream-fair 这个库。

 # Fair
 upstream backend_server {
    server 192.168.0.1:8000;
    server 192.168.0.2:8000;
    fair;
 }

Nginx 与 uWSGI 服务器的沟通

在前面的案例中,Nginx 都是使用 proxy_pass 转发的动态请求, proxy_pass 使用普通的 HTTP 协议与应用服务器进行沟通。如果你部署的是 Python Web 应用(Django, Flask), 你的应用服务器(uwsgi, gunicorn)一般是遵守 uwsgi 协议的,对于这种情况,建议使用 uwsgi_pass 转发请求。
如果你部署的是 Django 或则 Flask Web 应用,一个完整的 nginx 配置文件如下所示,可以使用通过 uWSG I或 gunicorn 部署的 Python Web 项目。

 # nginx配置文件,nginx.conf
 # 全局块
 user www-data;
 worker_processes  2;  ## 默认1,一般建议设成CPU核数1-2倍
 
 # Events块
 events {
   # 使用epoll的I/O 模型处理轮询事件。
   # 可以不设置,nginx会根据操作系统选择合适的模型
   use epoll;
   
   # 工作进程的最大连接数量, 默认1024个
   worker_connections  2048;
   
   # http层面的keep-alive超时时间
   keepalive_timeout 60;
   
 }
 
 http {    
     # 开启gzip压缩功能
     gzip on;
     
     # 设置允许压缩的页面最小字节数; 这里表示如果文件小于10k,压缩没有意义.
     gzip_min_length 10k; 
     
     # 设置压缩比率,最小为1,处理速度快,传输速度慢;
     # 9为最大压缩比,处理速度慢,传输速度快; 推荐6
     gzip_comp_level 6; 
     
     # 设置压缩缓冲区大小,此处设置为16个8K内存作为压缩结果缓冲
     gzip_buffers 16 8k; 
     
     # 设置哪些文件需要压缩,一般文本,css和js建议压缩。图片视需要要锁。
     gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 
     
     
     upstream backend_server {
         server 192.168.0.1:8000; # 替换成应用服务器或容器实际IP及端口
         server 192.168.0.2:8000;
     }
 
     server {
         listen 80; # 监听80端口
        # 可以是nginx容器所在ip地址或127.0.0.1,不能写宿主机外网ip地址
         server_name localhost; 
 
         charset utf-8;
         client_max_body_size 10M; # 限制用户上传文件大小
         
         # 客户端请求头部的缓冲区大小
         client_header_buffer_size 2k;
         client_header_timeout 15;
         client_body_timeout 15;
     
         access_log /var/log/nginx/mysite1.access.log main;
         error_log /var/log/nginx/mysite1.error.log warn;
         
         # 静态资源路径
         location /static {
             alias /usr/share/nginx/html/static; 
         }
         
         # 媒体资源路径,用户上传文件路径
         location /media {
             alias /usr/share/nginx/html/media;
         }
 
         location / {     
             include /etc/nginx/uwsgi_params;
             uwsgi_pass backend_server;   # 使用uwsgi_pass, 而不是proxy_pass
             uwsgi_read_timeout 600; # 指定接收uWSGI应答的超时时间
             uwsgi_connect_timeout 600;  # 指定连接到后端uWSGI的超时时间。
             uwsgi_send_timeout 600; # 指定向uWSGI传送请求的超时时间
 
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header Host $http_host;
             proxy_redirect off;
             proxy_set_header X-Real-IP  $remote_addr;
         }
     }
     
 } 
 

如果你的 nginx 与 uwsgi 在同一台服务器上,用不到负载均衡,你还可以通过本地机器的 unix socket 进行通信,这样速度更快,如下所示:

 location / {     
     include /etc/nginx/uwsgi_params;
     uwsgi_pass unix:/run/uwsgi/django_test1.sock;
 }

注意:取决于 Nginx 采用那种方式与 uWSGI 服务器进行通信(本地socket, 网络TCP socket和http协议),uWSGI 的配置文件也会有所不同。这里以 uwsgi.ini 为例展示了不同。

 # uwsgi.ini配置文件
 
 # 对于uwsgi_pass转发的请求,使用本地unix socket通信
 # 仅适用于nginx和uwsgi在同一台服务器上的情形
 socket=/run/uwsgi/django_test1.sock
 
 # 对于uwsgi_pass转发的请求,使用TCP socket通信
 socket=0.0.0.0:8000
 
 # 对于proxy_pass HTTP转发的请求,使用http协议
 http=0.0.0.0:8000
posted @   Thousand_Mesh  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示