Nginx基础

#「开学季干货」:聚焦知识梳理与经验分享#

Nginx简介

  • 高性能Web服务器

    [Nginx性能]  Nginx 的高并发,官方测试支持 5 万并发连接。实际生产环境能到 2-3 万并发连接数。10000 个非活跃的 HTTP keep-alive 连接仅占用约 2.5MB 内存。三万并发连接下,10 个 Nginx 进程,消耗内存 150M。淘宝 tengine 团队测试结果是“24G 内存机器上,处理并发请求可达 200 万”。

  • 静态资源:html、css、js、img、视频、音频;

  • 反向代理:代理客户访问内部(本机、局域网的服务器)服务;

  • 负载均衡:将请求(流量)分发给集群中的多台服务器,避免单点压力过大;

    [Nginx负载均衡]  nginx 的负载均衡策略可以划分为两大类:内置策略和扩展策略。内置策略包含加权轮询和 ip hash,在默认情况下这两种策略会编译进 nginx 内核,只需在 nginx 配置中指明参数即可。扩展策略有很多,如 fair、通用 hash、consistent hash 等,默认不编译进 nginx 内核。

  • 网站(后端API)入口:根据访问请求的路径参数,进行分发实现动静分离;

  • 之所以性能高,是因为Nginx架构:多进程+单线程架构、适合多核处理器;

    • 1个Master进程,N个Work进程;

    • Master监控所有Work进程,旧的Work进程终止时,随时可以启动新的进程;

    • Work进程使用单线程接收请求处理请求,避免了线程切换带来的消耗;

    • IO多路复用技术:异步非阻塞架构,同时处理更多的请求;

    • 异步非阻塞是“任务完成了通知你”,IO多路复用是“同时盯多个任务,看谁先完成”——两者结合,就是高性能服务器的核心逻辑。

Nginx (engine x) 是一款轻量级的 Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。

延伸版本:tengine(淘宝)、openresrt(章亦春)等

Ngnix 特点

  • 模块化设计:良好的扩展性,可以通过模块方式进行功能扩展。
  • 高可靠性:主控进程和 worker 是同步实现的,一个 worker 出现问题,会立刻启动另一个 worker。
  • 内存消耗低:一万个长连接(keep-alive),仅消耗 2.5MB 内存。
  • 支持热部署:不用停止服务器,实现更新配置文件,更换日志文件、更新服务器程序版本。
  • 并发能力强:官方数据每秒支持 5 万并发;
  • 功能丰富:优秀的反向代理功能和灵活的负载均衡策略

Nginx 功能

  • 支持静态资源的 web 服务器。
  • http,smtp,pop3 协议的反向代理服务器、缓存、负载均衡;
  • 支持 FASTCGI(fpm)
  • 支持模块化,过滤器(让文本可以实现压缩,节约带宽),ssl 及图像大小调整。
  • 内置的健康检查功能
  • 基于名称和 ip 的虚拟主机
  • 定制访问日志
  • 支持平滑升级
  • 支持 KEEPALIVE
  • 支持 url rewrite
  • 支持路径别名
  • 支持基于 IP 和用户名的访问控制。
  • 支持传输速率限制,支持并发数限制。

Nginx安装

  • apt/yum安装

    apt update
    apt install -y nginx
  • 源码编译安装

    ## 安装依赖
    sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
    ## 下载源码(nginx.org搜索官方最新的版本,点进去有Linux和Windows版本,选择Linux版本并复制链接)
    # wget http://192.168.57.200/Software/nginx-1.26.2.tar.gz(局域网)
    wget https://nginx.org/download/nginx-1.29.1.tar.gz
    ## 解压
    tar -zxvf nginx-*.tar.gz
    ## 进入解压后的Nginx源码目录
    cd nginx-1.29.1/
    ## 执行配置脚本,并指定安装目录和其他选项
    ./configure --prefix=/usr/local/nginx --with-http_ssl_module
    ## 编译并安装
    make && sudo make install

    静态网站制作:

    由于是编译安装所以没有/etc/nginx目录,默认存放在/usr/local/nginx,nginx命令在/usr/local/nginx/sbin/目录里,可以把它软链接到root下:ln -s /usr/local/nginx /usr/local/nginx/sbin/nginx

    补充静态网站配置文件里改和不改的内容:

    静态网站的核心需求是:指定首页文件(如 index.html)、确保目录访问逻辑正常。结合你的配置,需处理以下几处:

    在第 42 行 root /var/www/html; 下方 新增一行: index index.html index.htm;
    # 备份一个源文件以免后期出错(也可以不备份,已经有一个默认版本)
    cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
    # 编辑配置文件
    vim /usr/local/nginx/conf/nginx.conf
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    #user  nobody;          第2行是启动Work进程的用户    
    worker_processes  1;    第3行是默认启动1个Work进程,也可以设置成auto ,让它根据CPU核心数量自动启动Work进程
    #error_log  logs/error.log;      第5行是全局错误日志
    #pid        logs/nginx.pid;      第9行是进程号存储的路径
    events {                         #enevts模块配置(性能优化配置)
        use epoll;                   #使用epoll事件模型(Linux)
        worker_connections  1024;    第12~14行是每个worker最大连接数
        multi_accept on;             #一次性接受所有新连接,并发量高
        accept_mutex on;             #启用连接接收互斥锁
    }                                
    xxx(其余的修改见上方)
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    # 创建/var/www/html目录(如果root下路径改成了这个的话要创建),在下面vim index.html文件(也就是网站的首页配置)
    # 检查语法是否正确
    /usr/local/nginx/sbin/nginx -t
    # 重新加载配置
    /usr/local/nginx/sbin/nginx -s reload
    #测试网站是否能访问:
    由于你的 Nginx 监听 9050 端口(第 39-40 行),在浏览器输入:
    本地访问:http://localhost:9050
    局域网访问:http://你的服务器IP:9050
    (前提:确保 /var/www/html 目录下存在 index.html 文件,否则会显示目录列表 —— 因你已启用 autoindex on)。
  • HTTPS 相关配置(第 95-112 行): 第 95 行 #server { 及以下的 443 端口、ssl 证书配置,需保持注释(你未提供 SSL 证书文件 cert.pem/cert.key,启用会导致 Nginx 启动失败)。

  • PHP 相关配置(第 56-58 行、62-68 行): 这些是反向代理 PHP 脚本或连接 FastCGI 的配置,静态网站无需 PHP 解析,保持注释即可。

  • .htaccess 限制(第 73-75 行).htaccess 是 Apache 的配置文件,Nginx 不识别,无需启用,保持注释。
  • [docker安装]

docker run --name myNginx \
           -p 80:80 \
           -v /data/www/html:/usr/share/nginx/html \
           -d nginx

Nginx常用命令

nginx               启动Nginx

nginx -s stop       快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。

nginx -s quit       平稳关闭Nginx,保存相关信息,有安排的结束web服务。

nginx -s reload     因改变了Nginx相关配置,需要重新加载配置而重载。

nginx -s reopen     重新打开日志文件。

nginx -c filename   为 Nginx 指定一个配置文件,来代替缺省的。

nginx -t            不运行,仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。

nginx -v            显示 nginx 的版本。

nginx -V            显示 nginx 的版本,编译器版本和配置参数。

使用系统服务管理工具管理Nginx

systemctl reload nginx
vim /usr/lib/systemd/system/nginx.service
++++++++++++++++++++++++++++++++++++++++
[Unit]      #简介
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target #前置条件
​
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #启动
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID  #关闭
PrivateTmp=true
​
[Install]
WantedBy=multi-user.target
++++++++++++++++++++++++++++++++++++++++++
# 重新加载nginx或者关了再开
systemctl daemon-reload
systenctl reload nginx

Nginx基本配置

全局配置

http配置:所有HTTP请求与响应的配置

  • server配置:网站配置;可以配置多个(虚拟主机)

    • location配置:网站路径配置;

http{
    include mime.types;  #引入加载外部模块,子配置文件;mime.types是文件格式,文件类型+文件后缀,如果有新的可以加在后面;
    default_type  application/octet-stream;   #默认类型,二进制流MIME类型,表示“未知的二进制数据”,不存在就默认使用此类型,需要下载的文件
    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  logs/access.log  main;  #访问日志,每次访问都会被记录
    sendfile        on;      #通过内核级数据传输减少CPU消耗和延迟,加速
    tcp_nopush     on;       #配合sendfile,合并小包发送
    keepalive_timeout  65;   #长连接超时时间65秒,优化设置,延长访问时间
    #gzip  on;   #启动压缩,减少带宽,节省流量;但每次运算会占用CPU资源
    server {
        listen       80;     #监听的端口
        server_name  localhost;   #绑定域名,一台服务器可以使用多个域名
        #charset koi8-r;     #设置默认字符集
        #access_log  logs/host.access.log  main;   #设置独立的访问日志路径
        location / {         #设置网站的根路径;
            root   html;     #设置网站根目录对应的系统目录;默认是nginx安装路径下的html路径,/usr/local/nginx/html可以改成/var/www/html
            index  index.html index.htm;   #指定首页名称
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {   #报错的话就找这个目录
            root   html;
        }
        #location ~ \.php$ {   #反向代理
        #    proxy_pass   http://127.0.0.1;   #只要是以.php结尾的文件,就自动访问这个内部网站
        #}
​
    }
}

静态网站

搭建文件下载服务器

autoindex on; # 开启目录索引
autoindex_exact_size on; # 以易读单位显示文件大小
autoindex_localtime on; # 显示文件的本地时间(而非 GMT 时间)
server {
        charset   utf-8,gbk; # windows 服务器下设置后,依然乱码,暂时无解  
        listen       9050 default_server;
        listen       [::]:9050 default_server;
        server_name  down.blog.com;
        root         /data/;
}

虚拟主机,基于ip的虚拟主机,基于域名的虚拟主机,基于端口号的虚拟主机

代理与反向代理

负载均衡

优化配置

LNMP环境搭建

动静分离

Toncat基础

LNMT环境搭建

web集群搭建