• 功能
    • 静态资源web服务器
    • 结合FastCGI/SCGI等进行反向代理请求资源
    • http/https的反向代理
    • 邮件协议的反向代理
    • tcp/udp的请求转发
  • 组织架构
    • nginx由一个master主进程和worker工作进程组成
      • 主进程
        • 读取nginx配置文件验证其有效性和正确性
        • 建立,绑定,关闭socket连接
        • 按照配置生成,管理,结束工作进程
        • 接受外界指令,重启,升级及退出服务器等指令
        • 不中断服务升级,重新加载配置,失败进行回滚处理
        • 开启日志服务
        • 编译及处理perl脚本
      • 工作进程
        • 接受客户的请求
        • 将请求送入各个功能模块进行处理
        • IO调用,获取数据
        • 与后端服务器通信,接受后端服务器的处理结果
        • 缓存数据,访问缓存索引,查询,调用缓存数据
        • 发送请求结果,响应客户的请求
  • 模块
    • 核心:core module
    • 标准:ngxhttp*
      • HTTP core modules 默认功能
      • HTTP Optional modules 编译指定
    • Mail:ngxmail*
    • Stream:ngxstream*
    • 第三方模块
  • 安装

    • yum 安装

      1. #安装epel源
      2. yum install epel-release -y
      3. #安装nginx
      4. yum install nginx -y
      5. #检查包安装信息
      6. rpm -ql nginx
      7. #验证nginx
      8. nginx -v / nginx -V
    • 编译安装 ```shell

      准备编译基础环境

      yum install -y vim lrzsz tree screen psmisc lsof tcpdump wget ntpdate gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel net-tools iotop bc zip unzip zlib-devel bash-completion nfsutils automake libxml2 libxml2-devel libxslt libxslt-devel perl perlExtUtils-Embed

下载软件包并解压

cd /usr/local/src/ wget https://nginx.org/download/nginx-1.18.0.tar.gz tar xvf nginx-1.18.0.tar.gz

开始编译

cd nginx-1.18.0.tar.gz ./configure —prefix=/apps/nginx —user=nginx —group=nginx —with-http_ssl_module —with-http_v2_module —with-http_realip_module —with-http_stub_status_module —with-http_gzip_static_module —with-pcre —with-stream —with-stream_ssl_module —with-stream_realip_module —with-file-aio —add-module=/usr/local/src/echo-nginx-module —with-openssl=/usr/local/src/openssl-1.1.1d —with-threads make && make install

添加用户

useradd nginx -s /sbin/nologin -u 2000

修改目录属组

chown -R nginx.nginx /apps/nginx

验证

/apps/nginx/sbin/nginx -v

创建软连接

ln -s /apps/nginx/sbin/nginx /usr/sbin/

创建自启动脚本

vim /usr/lib/systemd/system/nginx.service [Unit] Description=The nginx HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking PIDFile=/run/nginx.pid

  1. # Nginx will fail to start if /run/nginx.pid already exists but has the wrong
  2. # SELinux context. This might happen when running `nginx -t` from the cmdline.
  3. # https://bugzilla.redhat.com/show_bug.cgi?id=1268621
  4. ExecStartPre=/usr/bin/rm -f /run/nginx.pid
  5. ExecStartPre=/apps/nginx/sbin/nginx -t
  6. ExecStart=/apps/nginx/sbin/nginx
  7. ExecReload=/bin/kill -s HUP $MAINPID
  8. KillSignal=SIGQUIT
  9. TimeoutStopSec=5
  10. KillMode=process
  11. PrivateTmp=true
  12. [Install]
  13. WantedBy=multi-user.target

重新加载

systemctl daemon-reload

  1. - **核心配置**
  2. - **新建web站点**
  3. - ** **
  4. ```shell
  5. #进入目录
  6. cd /apps/nginx/conf/
  7. mkdir test
  8. cd test
  9. #编写配置文件
  10. cat test001.conf
  11. server {
  12. listen 80;
  13. server_name www.nginx123.com;
  14. location / {
  15. root /data/nginx/html;
  16. }
  17. }
  18. #创建首页文件
  19. mkdir -p /data/nginx/html
  20. echo "test001" > /data/nginx/html/index.html
  • 创建其他站点

    1. server {
    2. listen 80;
    3. server_name www.nginx.com;
    4. location / {
    5. root /data/nginx/html;
    6. }
    7. location /about {
    8. root /data/nginx/html;
    9. }
    10. #此处访问的路径是 /data/nginx/html/about/index.html
    11. #也就是root路径+location的路径
    12. }
  • 创建别名访问

    1. server {
    2. listen 80;
    3. server_name www.nginx.com;
    4. location / {
    5. root /data/nginx/html;
    6. }
    7. location /about {
    8. alias /data/nginx/html;
    9. index index.html;
    10. }
    11. #此处默认会访问alias下的index.html , 即使about目录不存在
    12. }
  • location匹配

    1. = 匹配成功则立即处理请求
    2. ~ 区分大小写并匹配 !~ 区分大小写不匹配
    3. ~* 不区分大小写并匹配 !~* 不区分大小写并且不匹配
    4. ^~ 匹配开头 $ 匹配结尾
    5. \ 转义字符 匹配任意长度的任意字符
    • 综合匹配

      1. server {
      2. listen 80;
      3. server_name www.nginx.com;
      4. location / {
      5. root /data/nginx/html;
      6. }
      7. #精确匹配
      8. location = /1.jpg {
      9. root /data/nginx/html/images;
      10. }
      11. #不区分大小写
      12. location ~* /A.? {
      13. root /data/nginx/html/images;
      14. }
      15. #区分大小写
      16. location ~ /A.? {
      17. root /data/nginx/html/images;
      18. }
      19. #不区分大小写
      20. location ~* /aa.jpg {
      21. root /data/nginx/html/images;
      22. }
      23. #开头匹配
      24. location ^~ /images {
      25. root /data/nginx/html/images;
      26. }
      27. #结尾匹配
      28. location ~* \.(jpg|png)$ {
      29. root /data/nginx/html/images;
      30. }
      31. }
      32. #匹配优先级
      33. = ^~ ~/~* /
    • 四层访问控制

      1. location /about {
      2. alias /data/nginx/html;
      3. deny 10.0.10.0/24;
      4. deny 192.168.10.3;
      5. allow all;
      6. }
    • 账户认证 ```shell

      安装httpd-tools软件工具

      yum install httpd-tools -y apt install apache2-utils

      生成用户

      htpasswd -cbm /apps/nginx/conf/.htpasswd user1 123123 htpasswd -bm /apps/nginx/conf/.htpasswd user2 123123 第一次加c 往后就可以不用加了

location = /login/ { root /data/nginx/html; auth_basic “login password”; auth_basic_user_file /apps/nginx/conf/.htpasswd; }

  1. - **自定义错误页面**
  2. ```shell
  3. server {
  4. listen 80;
  5. server_name www.nginx.com;
  6. error_page 500 502 503 504 403 /error.html;
  7. location = /error.html {
  8. root /data/nginx/html;
  9. }
  10. }
  1. - **自定义访问日志**
  1. server {
  2. listen 80;
  3. server_name www.nginx.com;
  4. access_log /data/nginx/logs/www-nginx-com_access.log;
  5. error_log /data/nginx/logs/www-nginx-com_error.log;
  6. location / {
  7. root /data/nginx/html;
  8. }
  9. }
  1. - ** 检测文件是否存在**
  1. location /about {
  2. root /data/nginx/html;
  3. try_files $uri $uri/index.html $uri.html /about/default.html;
  4. #try_files $uri $uri/index.html $uri.html =888; 返回状态码
  5. }
  1. - ** 长连接配置**
  1. http {
  2. #请求最大数量,默认为100
  3. keeplive_requests 3;
  4. #超时时长,默认为75s 第二个值是返回给客户端看的,并无实际意义
  5. keeplive_timeout 65 100;
  6. }
  1. - ** 下载服务器**
  1. location /download {
  2. autoindex on; #自动索引
  3. autoindex_exact_size on; #显示文件精确大小
  4. autoindex_localtime on; #显示本机时间,而非格林时间
  5. limit_rate 10k; #限制下载速度
  6. }
  1. - ** 上传服务器**
  1. location /upload {
  2. root /data/nginx/html;
  3. #单个文件最大值为10m
  4. client_max_body_size 10m;
  5. #超出该值,则将数据缓存到磁盘
  6. client_body_buffer_size 16k;
  7. #设置存储的路径及目录,16 * 256 * 256 = 1048576
  8. client_body_temp_path /apps/temp/ 1 2 2;
  9. }
  1. - ** 其他配置**
  1. #限制除GET HEAD 之外的方法仅允许某个网段使用
  2. location /upload {
  3. root /data/nignx/html;
  4. limit_except GET {
  5. allow 10.0.10.0/24;
  6. deny all;
  7. }
  8. }
  9. #启用AIO功能,需要编译开启 --with-file-aio
  10. location /video {
  11. root /data/nginx;
  12. sendfile on;
  13. aio on;
  14. directio 8m; #大于8m使用磁盘IO , 小于使用sendfile
  15. directio_alignment 512;
  16. }
  17. #开启多线程--with-threads
  18. events{
  19. worker_connections 1024;
  20. use epoll;
  21. accept_mutex on;
  22. multi_accept on;
  23. }
  24. thread_pool pool11 threads=16;
  25. thread_pool pool22 threads=32;
  26. #调用
  27. location /video {
  28. root /data/nginx;
  29. sendfile on;
  30. aio thread=pool11;
  31. directio 8m;
  32. directio_alignment 4096;
  33. }
  34. 通过/proc/ngxin进程ID/status 查看 threads
  35. #缓存打开的文件
  36. open_file_cache on; #开启缓存文件信息
  37. open_file_cache max=100 inactive=60s; #最大缓存文件个数,非活动数据超时时间
  38. open_file_cache_valid 60s;#每隔60s检查缓存数据有效性
  39. open_file_cache_min_uses 5;#60秒内至少被访问5次才被标记
  40. open_file_cache_errors on;#缓存错误信息
  41. #隐藏nginx版本信息
  42. server_tokens off;
  1. - ** 零拷贝**
  1. - **零拷贝,一般有 mmap sendFile 两种**
  2. - **传统 IO 执行的话需要 4 次上下文切换(用户态 -> 内核态 -> 用户态 -> 内核态 -> 用户态)和 4 次拷贝(磁盘文件 DMA 拷贝到内核缓冲区,内核缓冲区 CPU 拷贝到用户缓冲区,用户缓冲区 CPU 拷贝到 Socket 缓冲区,Socket 缓冲区 DMA 拷贝到协议引擎)**
  3. - **mmap 将磁盘文件映射到内存,支持读和写,对内存的操作会反映在磁盘文件上,适合小数据量读写,需要 4 次上下文切换(用户态 -> 内核态 -> 用户态 -> 内核态 -> 用户态)和3 次拷贝(磁盘文件DMA拷贝到内核缓冲区,内核缓冲区 CPU 拷贝到 Socket 缓冲区,Socket 缓冲区 DMA 拷贝到协议引擎)。**
  4. - **sendfile 是将读到内核空间的数据,转到 socket buffer,进行网络发送,适合大文件传输,只需要 2 次上下文切换(用户态 -> 内核态 -> 用户态)和 2 次拷贝(磁盘文件 DMA 拷贝到内核缓冲区,内核缓冲区 DMA 拷贝到协议引擎)。**