Nginx学习笔记:从入门到精通

  1. Nginx简介

    Nginx是目前最流行的Web服务器之一,最初是由俄罗斯程序员Igor Sysoev开发的。经过多年的发展与改进,现已演变为一款具有高并发、高性能和稳定性强的设计十分出色的服务器软件。在2019年3月11日,Nginx以6.7亿美金的价格被美国F5公司收购,从此成为F5公司旗下的重要产品。

  2. Nginx的版本

    Nginx的开源版本主要分为两种:稳定版和主线版。稳定版经过长时间的测试后发布,稳定性较强;而主线版是最新的版本,功能更新更频繁,但可能存在一些尚未完全
    解决的bug。了解这些版本的特性,用户可以根据自己的具体需求和风险承受能力来选择适合自己的版本。

  3. Nginx安装方法

    安装完成后,可以通过命令行启动Nginx,并使用curl请求本地服务器,检查是否能够正常返回HTTP 200状态码,以确保安装成功。

    • 预编译二进制包安装
      对于大多数用户来说,使用预编译的二进制包安装是最快捷的方法。这个过程主要涉及更新本地的软件仓库信息、添加Nginx的官方仓库,并安装所需的依赖包。

      • CentOS系Linux安装示例:
        在CentOS系的Linux发行版中,可以使用yum安装命令,它允许用户从Nginx官方仓库中安装最新版本的Nginx。

        • # 1. 安装EPEL仓库
          sudo yum install epel-release
          
          # 2. 更新repo
          sudo yum update
          
          # 3. 安装nginx
          sudo yum install nginx
          
          # 4. 验证安装
          sudo nginx -V

      • Debian/Ubuntu安装示例:
        对于Debian或Ubuntu系统,可以使用apt-get来进行Nginx的安装。

        • # 1. 更新仓库信息
          sudo apt-get update
          
          # 2. 安装nginx
          sudo apt-get install nginx
          
          # 3. 验证安装
          sudo nginx -V

    • 源码编译安装
      这种方式允许用户自定义Nginx的安装目录、模块等,但比使用预编译包安装要复杂。自定义编译Nginx需要先安装必要的依赖库,如PCRE,用于处理正则表达式;zlib,用于处理gzip模块的压缩;以及OpenSSL,用于处理SSL加密。下载稳定版或主线版的Nginx源码后,用户可以配置编译选项,定制化自己的Nginx服务器。
  4. Nginx配置文件

    Nginx的主配置文件是nginx.conf,通常位于/etc/nginx/目录下。利用nginx -t命令可以检查配置文件的语法是否正确。配置文件主要由以下几个块组成

# 全局块
worker_processes 1;
events {
    # events块
}
http {
    # http块
    server {
        # server块
        location / {
            # location块
        }
    }
}

  • 全局块: 包含运行Nginx服务器的用户、允许生成的worker process数、进程PID存放路径、错误日志路径等。
# 指定运行Nginx服务器的用户,只能在全局块配置
# 将user指令注释掉,或者配置成nobody的话所有用户都可以运行
# user [user] [group]
# user nobody nobody;
user nginx;

# 指定生成的worker进程的数量,也可使用自动模式,只能在全局块配置
worker_processes 1;

# 错误日志存放路径和类型
error_log /var/log/nginx/error.log warn;

# 进程PID存放路径
pid /var/run/nginx.pid;
  • events块: 用于设置网络IO模型和每个worker process允许的最大连接数等。
events {
    # 指定使用哪种网络IO模型,只能在events块中进行配置
    # use epoll

    # 每个worker process允许的最大连接数
    worker_connections 1024;

}
  • http块: 包括http全局设置、server块设置、location块设置等。
http {
    # nginx 可以使用include指令引入其他配置文件
    include /etc/nginx/mime.types;

    # 默认类型,如果请求的URL没有包含文件类型,会使用默认类型
    default_type application/octet-stream; # 默认类型

    # 开启高效文件传输模式
    sendfile on;

    # 连接超时时间
    keepalive_timeout 65;

    # access_log 日志存放路径和类型
    # 格式为:access_log <path> [format [buffer=size] [gzip[=level]]
 [flush=time] [if=condition]];
    access_log /var/log/nginx/access.log main;

    # 定义日志格式
    log_format main '$remote_addr - $remote_user [$time_local]
 "$request" '
            '$status $body_bytes_sent "$http_referer" '
            '"$http_user_agent" "$http_x_forwarded_for"';

    # 设置sendfile最大传输片段大小,默认为0,表示不限制
    # sendfile_max_chunk 1m;

    # 每个连接的请求次数
    # keepalive_requests 100;

    # keepalive超时时间
    keepalive_timeout 65;

    # 开启gzip压缩
    # gzip on;

    # 开启gzip压缩的最小文件大小
    # gzip_min_length 1k;

    # gzip压缩级别,1-9,级别越高压缩率越高,但是消耗CPU资源也越多
    # gzip_comp_level 2;

    # gzip压缩文件类型

    # gzip_types text/plain application/javascript application/x-
javascript text/css application/xml text/javascript application/x-httpd-
php image/jpeg image/gif image/png;

    # upstream指令用于定义一组服务器,一般用来配置反向代理和负载均衡
    upstream www.example.com {
        # ip_hash指令用于设置负载均衡的方式,ip_hash表示使用客户端的IP进行hash,
这样可以保证同一个客户端的请求每次都会分配到同一个服务器,解决了session共享的问题
        ip_hash;
        # weight 用于设置权重,权重越高被分配到的几率越大
        server 192.168.50.11:80 weight=3;
        server 192.168.50.12:80;
        server 192.168.50.13:80;
}
  • server块: 用来定义虚拟主机的配置。
server {
    # 监听IP和端口
    # listen的格式为:
    # listen [ip]:port [default_server] [ssl] [http2] [spdy]
[proxy_protocol] [setfib=number] [fastopen=number] [backlog=number];
    # listen指令非常灵活,可以指定多个IP和端口,也可以使用通配符
    # 下面是几个实际的例子:
    # listen 127.0.0.1:80; # 监听来自127.0.0.1的80端口的请求
    # listen 80; # 监听来自所有IP的80端口的请求
    # listen *:80; # 监听来自所有IP的80端口的请求,同上
    # listen 127.0.0.1; # 监听来自来自127.0.0.1的80端口,默认端口为80

    listen 80;

    # server_name 用来指定虚拟主机的域名,可以使用精确匹配、通配符匹配和正则匹配等
方式
    # server_name example.org www.example.org; # 精确匹配
    # server_name *.example.org; # 通配符匹配
    # server_name ~^www\d+\.example\.net$; # 正则匹配
    server_name localhost;

    # location块用来配置请求的路由,一个server块可以包含多个location块,每个
location块就是一个请求路由
    # location块的格式是:
    # location [=|~|~*|^~] /uri/ { ... }
    # = 表示精确匹配,只有完全匹配上才能生效
    # ~ 表示区分大小写的正则匹配
    # ~* 表示不区分大小写的正则匹配
    # ^~ 表示普通字符匹配,如果匹配成功,则不再匹配其他location
    # /uri/ 表示请求的URI,可以是字符串,也可以是正则表达式
    # { ... } 表示location块的配置内容
    location / {
        # root指令用于指定请求的根目录,可以是绝对路径,也可以是相对路径
        root /usr/share/nginx/html; # 根目录
        # index指令用于指定默认文件,如果请求的是目录,则会在目录下查找默认文件
        index index.html index.htm; # 默认文件
    }
    # 下面是一些location的示例:
    location = / { # 精确匹配请求
        root /usr/share/nginx/html;
        index index.html index.htm;
    }
    location ^~ /images/ { # 匹配以/images/开头的请求
        root /usr/share/nginx/html;
    }
    location ~* \.(gif|jpg|jpeg)$ { # 匹配以gif、jpg或者jpeg结尾的请求
        root /usr/share/nginx/html;
    }
    location !~ \.(gif|jpg|jpeg)$ { # 不匹配以gif、jpg或者jpeg结尾的请求
        root /usr/share/nginx/html;
    }
    location !~* \.(gif|jpg|jpeg)$ { # 不匹配以gif、jpg或者jpeg结尾的请求
        root /usr/share/nginx/html;
    }

    # error_page 用于指定错误⻚面,可以指定多个,按照优先级从高到低依次查找
    error_page 500 502 503 504 /50x.html; # 错误⻚面
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

 Nginx常用命令和模块

Nginx的管理和操作依赖于一系列命令,包括启动、停止、重新加载配置文件等。Nginx还提供了众多模块以支持不同的功能,诸如HTTP基本认证、自动索引、gzip压缩支持、反向代理支持等。 

nginx # 启动Nginx
nginx -c filename # 指定配置文件
nginx -V # 查看Nginx的版本和编译参数等信息
nginx -t # 检查配置文件是否正确,也可用来定位配置文件的位置
nginx -s quit # 优雅停止Nginx
nginx -s stop # 快速停止Nginx
nginx -s reload # 重新加载配置文件
nginx -s reopen # 重新打开日志文件

 Nginx的常用模块

模块名(Module Name) 描述(Description)
http_access_module 接受或者拒绝特定的客户端请求
http_auth_basic_module HTTP基本认证,使用用户名和密码来限制对资源的

访问

http_autoindex_module 自动索引,用于显示目录列表
http_browser_module 从 User-Agent 请求头中获取和识别客户端浏览器
http_charset_module 添加特定的字符集到 Content-Type 响应头中
http_empty_gif_module 返回一个1像素的透明GIF图片
http_fastcgi_module FastCGI支持
http_geo_module 从IP地址中获取地理位置信息
http_gzip_module Gzip压缩支持
http_limit_conn_module 限制并发连接数
http_limit_req_module 限制请求速率
http_map_module 从变量中获取值
http_memcached_module Memcached支持
http_proxy_module 反向代理支持
5. Nginx的常用命令

6. Nginx的常用模块
nginx # 启动Nginx
nginx -c filename # 指定配置文件
nginx -V # 查看Nginx的版本和编译参数等信息
nginx -t # 检查配置文件是否正确,也可用来定位配置文件的位置
nginx -s quit # 优雅停止Nginx
nginx -s stop # 快速停止Nginx
nginx -s reload # 重新加载配置文件
nginx -s reopen # 重新打开日志文件

http_referer_module 防盗链
http_rewrite_module URL重写
http_scgi_module 转发请求到SCGI服务器
http_ssi_module 处理和支持SSI(Server Side Includes)
http_split_clients_module 根据客户端IP地址或者其他变量将客户端分配到组

中,一般用于A/B测试
http_upstream_hash_module 启用一致性哈希负载均衡
http_upstream_ip_hash_module 启用IP哈希负载均衡
http_upstream_keepalive_module 启用⻓连接负载均衡
http_upstream_least_conn_module 启用最少连接负载均衡
http_upstream_zone_module 启用共享内存负载均衡
http_userid_module 为客户端设置一个唯一的ID(UID、cookie)
http_uwsgi_module 转发请求到uWSGI服务器,一般用于Python应用

总结

 本文档提供了Nginx的一个全面学习教程,无论是对初学者还是有经验的使用者都是极具价值的资源。关键的操作、配置与优化步骤被详细地展示和解释,确保读者在掌握基础的同时,也能够深入理解Nginx的高级功能和最佳实践。

  • 17
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值