nginx简介

概念

在这里插入图片描述

特点

在这里插入图片描述

nginx架构

在这里插入图片描述

  • 注意:默认情况下,nginx会建立和服务器CPU核心数相等的worker进程,woker进程之间相互独立,若一个进程故障不会影响其它进程

nginx关键工作机制

  • 抢占机制:当客户端发起请求时,会激活accept_mutex互斥锁,那个worker抢占了该互斥锁,该客户端的请求就由那个worker响应和处理

在这里插入图片描述

  • 异步非阻塞模式:在传统事件处理模式下,如果所有的worker被客户端阻塞后,新来的客户就需要等待,直到原来的客户端释放worker后才能被处理请求,在异步非阻塞模式下,底层使用了linux的epoll模型,就算worker被阻塞,新的客户端请求也会被正常处理

在这里插入图片描述

nginx正向代理功能

  • 图:
    在这里插入图片描述

  • 分析:它的工作原理就像一个跳板,简单的说,我是一个用户,我访问不了某网站,但是我能访问一个代理服务器,这个代理服务器呢,他能访问那个我不能访问的网站,于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容,代理服务器去取回来,然后返回给我,从网站的角度,只在代理服务器来取内容的时候有一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。

  • 理解:

    • 客户端 <一> 代理 <一> 服务端A租房人(客户端) B房产中介(代理) C真实房东(服务端)
    • A租房人(客户端)想租C真实房东的房子,但不认识C真实房东(服务端)
    • B房产中介(代理)认识C真实房东(服务端),并且从C真实房东(服务端)租到了房
    • A租房人(客户端)通过B房产中介(代理)租到了C真实房东(服务端)的房
    • C真实房东(服务端)只知道房子租给了B房产中介(代理),并不知道A租房人(客户端)租了自己的房子
  • 结论:正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。就像要访问google用vpn代理FQ去访问(用户知道要访问真正的服务器)

nginx反向代理功能

  • 图:
    在这里插入图片描述

  • 分析:反向代理正好相反,它也是在客户端和服务器端的一个代理服务器,但是这个代理服务器的目的是用来保护服务器端的,当外网客户端来访问我们的服务器时为了避免暴露应用服务器的实际ip地址,我们会让客端访问代理服务器,然后代理服务器再根据客户端的请求去实际的应用服务器获取响应内容并返回客户端

在这里插入图片描述

nginx负载均衡功能

在这里插入图片描述

部署Nginx

[root@server ~]# setenforce  0

[root@server ~]# systemctl stop  firewalld

[root@server ~]# systemctl disable  firewalld

[root@server ~]# yum  install  nginx  -y

[root@server ~]# nginx  -V  # 查看版本,编译器、配置参数等信息

[root@server ~]# systemctl start  nginx   # 启动httpd

[root@server ~]# systemctl enable  nginx  # 设置开机启动
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

[root@server ~]# systemctl status  nginx    # 查看状态,q键退出查看

[root@server ~]# ps  -ef  |  grep  nginx  # 查看进程
root        1690       1  0 13:57 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx       1691    1690  0 13:57 ?        00:00:00 nginx: worker process
nginx       1692    1690  0 13:57 ?        00:00:00 nginx: worker process
root        1726    1510  0 14:00 pts/0    00:00:00 grep --color=auto nginx

# 测试,Windows中打开浏览器输入服务器IP地址

在这里插入图片描述

常用命令

systemctl系列

systemctl  start  nginx   # 启动服务

systemcctl restart  nginx  # 重启服务

systemctl  enable  nginx   # 开机启动

systemctl  stop  nginx     # 停止服务

systemctl  disable  nginx  # 取消开机启动

systemctl  status   nginx  # 查看状态

nginx自带命令

nginx    # 启动nginx

nginx   restart  # 重启服务

nginx  -s  reload  # 重新加载配置文件

nginx  -s  stop    # 强行停止服务

nginx  -s  quit    # 优雅停止服务,即所有请求处理完后退出服务

nginx  -v         # 查看版本号

nginx -t         # 检查配置文件的语法错误,无错返回ok

nginx配置文件

[root@server ~]# cd  /etc/nginx     # 服务目录
[root@server nginx]# yum  install  tree  -y
[root@server nginx]# tree
.
├── conf.d                 # 子配置文件目录
├── default.d
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── koi-utf               #  KOI8-R 编码(俄语)转换的映射文件
├── koi-win               # #  KOI8-R 编码(俄语)转换的映射文件
├── mime.types             # 配置支持的媒体类型
├── mime.types.default     # 样例文件
├── nginx.conf             # 主配置文件
├── nginx.conf.default     # 样例文件
├── scgi_params
├── scgi_params.default
├── uwsgi_params
├── uwsgi_params.default
└── win-utf                #  KOI8-R 编码(俄语)转换的映射文件

2 directories, 15 files

网页默认目录:/usr/share/nginx/html
访问日志:/var/log/nginx/access.log
错误日志:/var/log/nginx/error.log

主配置文件

[root@server ~]# vim  /etc/nginx/nginx.conf

结构

在这里插入图片描述

分析

  • 层级结构图

在这里插入图片描述

  • 配置分析
# main配置段(全局配置)
user nginx;              # 运行的账户,默认即是nginx,可以不进行设置
worker_processes auto;   # worker进程数,根据硬件调整,通常等于CPU数量或者2倍于CPU
error_log /var/log/nginx/error.log;   # 错误日志存放目录
pid /run/nginx.pid;     # 指定运行Nginx master主进程的pid文件存放路径

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;  #  导入的外部文件位置

# events配置段,性能模块设置,其中可以设置时间处理模式等
events {
         use epoll;     # 使用epoll事件驱动模型,但不推荐配置它,让nginx自己选择
         worker_connections 1024;   # 每个进程的最大连接数量(并发数)
         accept_mutex on # 默认是off关闭的,这里推荐打开
}

# http配置段,包含全局块和server块,使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
http {
    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  /var/log/nginx/access.log  main;   # 访问日志存储位置

    sendfile            on;   # 高效文件传输模式,默认开启
    tcp_nopush          on;   # 性能优化参数,数据是否立刻发送
    tcp_nodelay         on;   # 性能优化参数,小数据包是否延迟发送
    keepalive_timeout   65;   # 超时时间
    types_hash_max_size 4096; # 性能优化参数,影响散列表的冲率

    include             /etc/nginx/mime.types;      # 可解析的静态资源类型
    default_type        application/octet-stream;   # 默认文件类型

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;   # 加载子配置项
    # server配置段,虚拟主机设置
    server {
        listen       80;        # 监听IPV4端口
        listen       [::]:80;   # 监听IPV6端口
        server_name  _;         # 访问的域名
        root         /usr/share/nginx/html;    # 网页默认目录

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;   # 子配置文件存储路径

        # location配置段,一般用来匹配不同的URI请求
        location / {
            root   /usr/share/nginx/html;     # 相对路径网站根目录
            alias  /usr/share/nginx/html/;    # 绝对路径网站根目录
            index  index.html index.htm;      # 默认首页文件
            deny 172.168.22.11;       # 禁止访问的ip地址,可以为all
            allow 172.168.33.44;     # 允许访问的ip地址,可以为all
            autoindex  on;           # 开启目录文件列表
            autoindex_exact_size on;   # 显示出文件的确切大小,单位是bytes
            autoindex_localtime on;    # 显示的文件时间为文件的服务器时间
            charset utf-8,gbk;         # 避免中文乱码
            auth_basic "xxxx";   # 加密网页验证时的提示信息
            auth_basic_user_file   /路径/文件名;   # 加密网页使用的密码验证文件
            }
        error_page 404 /404.html;        # 404时返回给客户端的页面
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;  # 50x错误返回给客户端的页面
           location = /50x.html {
        }
    }

# Settings for a TLS enabled server.   # https虚拟主机定义
#
#    server {
#        listen       443 ssl http2;    # 监听的IPV4端口
#        listen       [::]:443 ssl http2;
#        server_name  _;
#        root         /usr/share/nginx/html;   # 网页默认目录
#
#        ssl_certificate "/etc/pki/nginx/server.crt";   # 证书存储路径
#        ssl_certificate_key "/etc/pki/nginx/private/server.key"; # 密钥存储
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

注意

  • server_name指令一般用于指定虚拟主机的域名,在匹配时有以下四中写法
    • 精确匹配:server_name http://www.nginx.com ;
    • 左侧匹配:server_name *.http://nginx.com ;
    • 右侧匹配:server_name www.nginx.* ;
    • 正则匹配:server_name ~^www.nginx.*$ ;
    • 注:匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
  • root指令与alias指令区别
    • root指令用于静态资源目录位置,它可以写在 http 、 server 、 location 等配置中,root指令定义的路径会与 URI 叠加产生最终访问路径,如:
    • location /image { root /opt/nginx/static;}# 当用户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png
    • alias也是指定静态资源目录位置,但只能访问指定的绝对路径,不会叠加目录,只能写在 location 中且末尾一定要添加 / , 如:
    • location /image { alias /opt/nginx/static/image/;}#当用户访问 www.test.com/image/1.png 时,实际在服务器找的路径是 /opt/nginx/static/image/1.png
  • location匹配路径
    • 格式:
    • location [ = | ~ | ~* | ^~ ] uri { ...}
    • 匹配规则:
      • = 精确匹配;
      • ~ 正则匹配,区分大小写;
      • ~* 正则匹配,不区分大小写;
      • ^~ 匹配以某个字符串开头,不是正则匹配;
      • / 通用匹配,如果没有其它匹配,任何请求都会匹配到
      • 注:匹配优先级:= > ^~ > ~ > ~* > 不带任何字符。
    • 示例
    • server { listen 80; server_name www.nginx-test.com; # 只有当访问 www.nginx-test.com/match_all/ 时才会匹配到/usr/share/nginx/html/match_all/index.html location = /match_all/ { root /usr/share/nginx/html index index.html } # 当访问 www.nginx-test.com/1.jpg 等路径时会去 /usr/share/nginx/images/1.jpg 找对应的资源 location ~ \.(jpeg|jpg|png|svg)$ { root /usr/share/nginx/images; } # 当访问 www.nginx-test.com/bbs/ 时会匹配上 /usr/share/nginx/html/bbs/index.html location ^~ /bbs/ { root /usr/share/nginx/html; index index.html index.htm; }}# 注意:location / { root html; index index.html index.htm; }# 其/不是根目录而是统统都匹配到指定路径,而指定路径为html ,即nginx的默认网页目录/usr/share/nginx/html
    • uri中的斜线,如:
    • location /test { # 尾部无/ ...}location /test/ { ...}
    • 不带 / 当访问 http://www.nginx-test.com/test 时, Nginx 先找是否有 test 目录,如果有则找 test 目录下的 index.html ;如果没有 test 目录, nginx则会找是否有 test 文件。
    • 带 / 当访问 http://www.nginx-test.com/test 时, Nginx先找是否有 test 目录,如果有则找 test 目录下的 index.html ,如果没有它也不会去找是否存在 test 文件。

nginx.conf 配置文件的语法规则

  • 配置文件由指令与指令块构成
  • 每条指令以 “;” 分号结尾,指令与参数间以空格符号分隔
  • 指令块以 {} 大括号将多条指令组织在一起
  • include 语句允许组合多个配置文件以提升可维护性
  • 通过 # 符号添加注释,提高可读性
  • 通过 $ 符号使用变量
  • 部分指令的参数支持正则表达式,例如常用的 location 指令