用户头像 点击登录
儿童
普通
限制
用户头像 点击登录

Nginx 安装与配置

xdatum 2021-09-13

Nginx 安装与配置

基本概念

Nginx 是目前最活跃的WEB服务器。

  • 根据 Netcraft 2016年11月的调查,在所有“活跃”站点(占被调查站点的18.22%)和前100万最繁忙的站点(占被调查站点的27.83%)中,Nginx 是使用数量最多的WEB服务器。
  • 根据 W3Techs 的数据显示,互联网上前100万个网站中37.7%的网站使用了Nginx;前10万个网站中49.7%的网站使用了Nginx; 前1万个网站中57.0%的网站使用了Nginx。
  • 根据 BuiltWith 统计数据,Nginx 在全球前1万个网站中,被使用占比达到 38.2%。
  • 维基百科目前正使用 Nginx 作为 SSL终端代理。
  • OpenBSD 从 5.2 版本(2012年11月1日)起,将 Nginx 作为其基础系统的一部分,成为 Apache 1.3 系统的替代方案(但后来又替换成了 OpenBSD 自己的 Httpd)。

特性

  1. Nginx 是基于异步框架的网页服务器,它可以用作:

    • 反向代理
    • 负载均衡
    • HTTP 缓存
  2. Nginx 支持多种应用服务:

    • FastCGI脚本
    • SCGI处理程序
    • WSGI应用服务器
    • Phusion Passenger动态HTTP
  3. Nginx 具有优异的性能

    • Nginx 使用的是异步事件驱动框架来处理请求,其模块化时间驱动架构可以在高负载下提供可预测的性能。
    • Nginx 拥有比传统服务器 Apache, Lighttpd等更好的性能,主要表现在:
      • 内存占用少
      • 稳定性高
  4. Nginx 整体采用模块话设计,有丰富的模块库和第三方模块库,能够灵活配置。

  5. Nginx 在 Linux 操作系统下采用了效率非常高的 Epoll 事件模型,性能尤为优异。

  6. Nginx 在 OpenBSD 和 FreeBSD 操作系统下采用了 类似于 Epoll 的 高效事件模型 Kqueue,性能表现也很突出。

  7. 在 Nginx 官方测试数据中显示,Nginx 能够支持5万个并行连接,并且CPU,内存等资源的占用都非常低,且运行非常稳定。

  8. 在实际运行过程中,Nginx 通常可以支持2万至4万个并行连接。

应用场景

  1. Http 服务器。
    Nginx 本身提供独立的HTTP服务,可以独立用于静态网页的Http服务。
  2. 虚拟主机
    Nginx 可以在同一台服务器中根据一定的配置规则虚拟出多个网站。
  3. 反向代理
    Nginx 可以作为反向代理来隐藏实际提供服务的主机。
  4. 负载均衡
    当网站规模很大时,单台服务器已经无法支持实际处理要求时,可以通过 Nginx 作为前置服务对多台服务器进行集群,通过一定的策略有效的利用集群中的主机,实现负载均衡。同时,也不会因为集群中的某台机器发生宕机而引发故障。

工作原理

Nginx 采用 Master-Worker 模式进行工作,启动 Nginx 后,可以在进程中看到
nginx: master processnginx: worker process 两个进程。

  1. master 进程的作用是:
    • 读取和验证 Nginx 配置文件
    • 管理 worker 进程
  2. worker 进程的作用是:
    • 每个 worker 进程都维护了一个线程(这样可以避免线程切换带来的性能损耗)来处理连接和请求
    • worker 进程的个数由配置文件决定,通常情况下服务器有几个CPU就配置几个worker进程。

安装和配置

建议使用仓库安装,比较简单,省去很多繁琐的配置细节。
这里以CENTOS8为例。

  1. 添加 nginx 仓库
    编辑 /etc/yum.repos.d/nginx.repo
    写入内容

    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    
    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true
    
  2. 选定 Nginx 版本

    yum-config-manager --enable nginx-mainline
    
  3. 安装 nginx

    yum -y install nginx
    
  4. 修改配置
    编辑配置文件 /etc/nginx/nginx.conf
    增加配置项

    worker_rlimit_nofile 204800;	// 增加文件打开限制
    

    修改 worker_connections1024000,这里是单个worker的处理数

  5. 启动 nginx

    systemctl start nginx
    
  6. nginx 服务配置
    配置文件在 /etc/nginx/conf.d/xxxx.conf
    这里建议一个域名配置一个单独的文件,方便管理。

  7. nginx 反向代理配置

    # 上游服务器设置
    upstream xxx.com.upstream {
    #	server 虚拟域名或IP地址: 端口	weight=权重值,越大优先级越高
    	server xxx.001.com	weight=10;
    	server xxx.002.com	weight=5;
    	server 10.0.0.1:80	weight=5;
    
    #	备份的域名
    	server xxx.004.com	backup;
    
    #	sock 配置,不建议使用
    #	server unix:/tmp/xxx.sock;
    }
    # HTTP 服务器信息
    server {
    #	配置域名
        server_name xxx1.com xxx2.com;
    	access_log  /data/logs/xxx_access.log;
        error_log  /data/logs/xxx_error.log;
    
    #	代理所有请求
        location / {
    		proxy_pass http://xxx.com.upstream;
    		proxy_set_header Host $host;
    		proxy_set_header X-Real-IP $remote_addr;
    		proxy_set_header REMOTE-HOST $remote_addr;
    		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    	#	静态图片缓存
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
            expires      30d;
            error_log off;
            access_log /dev/null;
        }
    	#	静态脚本缓存
        location ~ .*\.(js|css)?$ {
            expires      12h;
            error_log off;
            access_log /dev/null;
        }
    
    	listen 80;
    #	默认页
        index index.php index.html index.htm default.php default.htm default.html;
    }
    
  8. nginx 日志管理
    将nginx访问日志按日期进行分割,分割的目的是防止日志过大,同时可以便于定位。
    在nginx中访问日志路径支持变量,但是错误日志不支持。
    可以全局或在 serverhttp 中设置日期变量:

    map $time_iso8601 $logdate {
    	'~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
    	default                       'date-not-found';
    }
    

    nginx支持多个日志输出。
    中途可以删除日志文件。

nginx 正则表达式

基础规则与常规正则表达式一致。

  1. ^: 匹配字符串的开始配置;
  2. $: 匹配字符串的结束位置;
  3. .*: 匹配任意字符串, * 表示匹配数量为 0 到 无穷 多;
  4. \.: 斜杠用于转义,斜杠后的字符不进行正则解释。用于表示正则特定字符的原意;
  5. (值1|值2|值3): 或匹配模式,括号中的任一值可匹配,即认为匹配成功;
  6. i: 不区分大小写
  7. ~: 用于表达式前,表示区分大小写的匹配
  8. ~*: 用于表达式前,表示不区分大小写的匹配
  9. !~: 用于表达式前,表示区分大小写的不匹配
  10. !~*: 用于表达式前,表示不区分大小写的不匹配
  11. +: 匹配 1 到 无穷 多

Nginx server_name 配置

  1. 精确匹配
server {
    server_name xxx.com xx2.com;
}
  1. * 通配符开始,可以实现 xxx.com 下的所有子域名使用此解析。
server {
    server_name *.xxx.com;
}
  1. * 结尾,指定特定子域名
server {
    server_name www.*;
}
  1. 匹配正则表达式,其中 www 可以作为变量 $www 使用。
server {
    server_name ~^(?<www>.+)\.xxx\.com$;
    localtion / {
        root    /sites/$www;
    }
}