Nginx

什么是Nginx

Nginx是一个 高性能 的Http和反向代理Web服务器、且提供邮件服务,特点 占用内存小、并发能力强,支持高达 5 万个并发数

Nginx架构

  • 一个Master进程和多个Worker进程,Master进程管理维护Worker进程,Worker进程以独立的单进程的io多路复用的网络模型(Linux),从而实现热部署; worker进程的数量以服务器的cpu数量对应时能把性能发挥到极致。
  • Nginx最大连接数:worker_processes * worker_connections,即:worker进程*每个进程的连接数。
  • Nginx处理静态资源最大并发数:worker_processes * worker_connections/2,即:一个请求2个连接。
  • Nginx处理反向代理最大并发数:worker_processes * worker_connections/4,即:一个请求4个连接。

Nginx应用

反向代理

  • 正向代理:VPN,安装在客户端
  • 反向代理:安装在服务端

动静分离

* 将不需要后台操作的静态文件进行缓存操作,让后台更多的处理动态请求,提高资源的访问速度。

负载均衡

  • 内置策略
    • 轮询(默认):均等访问不同的服务器。
    • 加权轮询:根据不同的服务器配置,添加不同的权重,权重越大访问越多。
    • ip hash:以客户端请求的ip进行hash操作,以hash结果将同一个ip分发到同一台服务器进行处理,可以解决session不共享问题。
  • 扩展策略

Nginx 配置

  • 全局块:

    • worker_processes auto:根据 cpu 个数自动分配 worker 进程数量。

      • worker_processes 1:处理并发服务,值越大支持并发越高,受环境的制约(cpu)。
    • worker_priority -20 :设置cpu进程时间片的时间长度,通过调整 NICE 即静态优先级 -20~19 区间。静态优先级越小优先级越高。

      #查看NICE的值,nginx为nginx应用的用户组
      top -u nginx
      
    • worker_cpu_affinity cpumask:为了 worker 进程能够使用 cpu 的高速缓存,将 worker 进程和 cpu 进行一对一绑定。

      #示例 4个cpu,绑定cpu0,cpu1,cpu2,cpu3
      worker_processes 4;
      worker_cpu_affinity 0001 0010 0100 1000;
      #查看cpu缓存级数、每级大小。
      dmesg | grep cache
      #查看cpu0 缓存大小(有三级缓存)
      cat /sys/devices/system/cpu/cpu0/cache/index1/size
      cat /sys/devices/system/cpu/cpu0/cache/index2/size
      cat /sys/devices/system/cpu/cpu0/cache/index3/size
      #查看cpu1 缓存大小(有三级缓存)
      cat /sys/devices/system/cpu/cpu1/cache/index1/size
      
    • accept_mutex on|offLinux 3.9+时使用“reuseport”会有更好性能,建议:设置为off 关闭。

      #reuseport 示例
      list address[:port] reusepor;
      accept_mutex off;
      
  • events 块:网络连接。

    • worker_connections 1024:每个work支持的最大连接数。
  • http 块:代理、缓存、日志、负载均衡、动静分离。

  • server块:

    • listen 80:监听tcp80端口。
    • server_name localhost:主机名称。
    • location [ = | / | ~ | ~ | ^~ ] uri*:
      • = :不含正则的严格匹配。
      • ~ :正则匹配,并区分大小写。
      • ~* :正则匹配,并区分大小写。
      • ^~ :不含正则,标识uri和请求字符串匹配度最高的locaion进行处理。
    • **proxy_pass http://127.0.0.1:8080 **:反向代理

Nginx优化

  • 三大方向:文件IO、网络IO、网络连接。

    • 文件IO
      • 优化读取速度:sendfile on;
  • 设置进程静态优先级:worker_priority -20

  • 设置 worker 进程数:worker_processes cpu个数

  • 绑定 cpu 提高缓存命中率:worker_cpu_affinity cpumask

  • worker 进程间的负载均衡:accept_mutex off

  • 设置单个worker进程连接数:worker_connections 1024

  • 设置所有worker进程连接数:worker_rlimit_nofile 1024

  • 使用epoll事件模型:在RHEL/CentOS系统默认使用epoll事件。

    #优化示例
    worker_processes     4;
    worker_cpu_affinity  0001 0010 0100 1000;
    worker_priority      -15;
    events {
        worker_connections  1024;
        accept_mutex        off;
    }
    http {
        include           mime.types;
        default_type      application/octet-stream;
        sendfile          on;
        keepalive_timeout 65;
        gzip              on;
        server {
            listen        80 reuseport;
            server_name   www.a.com a.com;
            #将所有HTTP请求通过rewrite指令重定向到HTTPS。
            #rewrite ^(.*)$ https://$host$1;
            return 301 https://$host$request_uri;
    
            location = / {
                proxy_pass   http://127.0.0.1:8080/en/;
            }
    
            location / {
                proxy_pass   http://127.0.0.1:8080/;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    }
    server {
       	 listen 443 ssl reuseport;
       	 server_name www.a.com a.com;
             root html;
             index index.html index.htm;
             ssl_certificate /usr/local/5514532_www.a.com.pem;
             ssl_certificate_key /usr/local/5514532_www.a.com.key;
             ssl_session_timeout 5m;
             ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
             #表示使用的加密套件的类型。
             ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
             #表示使用的TLS协议的类型。
             ssl_prefer_server_ciphers on;
             location = / {
                    proxy_pass   http://127.0.0.1:8080/en/;
             }
             location / {
                    proxy_pass   http://127.0.0.1:8080/;
             }
        }
    
    

Linux安装、操作

1、官方下载-稳定版本

http://nginx.org/en/download.html

版本

2、上传解压安装

#解压到/usr/local/目录下
tar -zxvf nginx-1.20.0.tar.gz -C /usr/local/
#安装依赖
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
#重命名
cd /usr/local/
mv nginx-1.20.0 nginx
#进入到Nginx
cd nginx
#执行配置
./configure --with-http_stub_status_module --with-http_ssl_module --with-pcre
#编译安装
make && make install
#检查是否安装成功
/usr/local/nginx/sbin/nginx -v

3、常用命令

#启动
/usr/local/nginx/sbin/nginx
#重载配置
/usr/local/nginx/sbin/nginx -s reload
#强制停止
/usr/local/nginx/sbin/nginx -s stop
#正常停止
/usr/local/nginx/sbin/nginx -s quit
#检查语法
/usr/local/nginx/sbin/nginx -t
#查看进程
ps -ef|grep nginx
#开放防火墙80端口(同时服务器安全组也要开放)
firewall-cmd --permanent --zone=public --add-port=80/tcp
#重载防火墙配置
firewall-cmd --reload

浏览器访问显示:Welcome to Nginx !

4、配置负载均衡

upstream webService { 
    server 47.168.10.121:8080 weight 2;
    server 47.168.10.122:8080 weight 1;
    server 47.168.10.100:8080 weight 1;
}
server {
    ....
    location  ~*^.+$ {         
        proxy_pass  http://webService;      
    }
}

5、配置反向代理

server {
    ....
    location / {         
        proxy_pass  http://127.0.0.1:8080;      
    }
}

6、配置Https

  • 上传SSL证书
  • 配置nginx.conf
server {
   listen 443 ssl;
   #配置HTTPS的默认访问端口为443。
   #如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
   #如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。
   server_name yourdomain.com; #需要将yourdomain.com替换成证书绑定的域名。
   root html;
   index index.html index.htm;
   #需要将cert-file-name.pem替换成已上传的证书文件的名称。
   ssl_certificate cert/cert-file-name.pem;  
   #需要将cert-file-name.key替换成已上传的证书密钥文件的名称。
   ssl_certificate_key cert/cert-file-name.key; 
   ssl_session_timeout 5m;
   ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
   #表示使用的加密套件的类型。
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。
   ssl_prefer_server_ciphers on;
   location / {
       root html;  #站点目录。
       index index.html index.htm;
   }
}
#设置HTTP请求自动跳转HTTPS
server {
   listen 80;
   server_name yourdomain.com; #需要将yourdomain.com替换成证书绑定的域名。
	#方式一
	rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。
	#方式二:性能一般
	#rewrite ^ https://$host$request_uri? permanent;
   #方式三:性能最好
   #return 301 https://$host$request_uri;
}
#开放防火墙443端口(同时服务器安全组也要开放)
firewall-cmd --permanent --zone=public --add-port=443/tcp
#重载防火墙配置
firewall-cmd --reload
posted @   Soul-Q  阅读(161)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示