nginx

nginx服务的软件特点:

1) 支持高并发,消耗内存资源少
2) 具有多种功能
网站web服务功能 --- apache
网站负载均衡功能 --- LVS
网站缓存服务 --- Squid
3) 在多种系统平台都可以进行部署
4) nginx实现网络通讯时使用的时异步网络IO模型: epoll模型(apache -- select模型)


epoll模型:
宿舍管理员: 找人,查看人员登记信息
幼儿园阿姨: 小朋友上厕所, 都站在教室的某个位置

select模型
宿舍管理员: 找人,一个一个屋子去问, --线性轮询
幼儿园阿姨: 小朋友上厕所, 一个一个小朋友去询问

nginx软件的安装部署过程:

编译安装

第一个步骤:
wget http://nginx.org/download/nginx-1.16.0.tar.gz
PS: 解决软件的依赖 openssl-devel pcre-devel


第二个步骤:
解压下载好的软件, 并进入到软件目录中


第三个步骤:
编译安装三步曲

a 进行配置操作
./configure  --help

./configure --prefix=  --user=USER 
--prefix=PATH     set installation prefix    
                  指定程序安装路径
--user=USER       set non-privileged user for worker processes
                  设置一个虚拟用户管理worker进程(安全)
--group=GROUP     set non-privileged group for worker processes
                  设置一个虚拟用户组管理worker进程(安全)

b 进行软件的编译过程:
make 编译(翻译) 
C(英国人)       代码(任务文件)  系统识别  翻译  系统(中国人)处理代码
翻译效率比较低  翻译官(gcc)
python(日本人)  代码(任务文件)  系统识别  翻译  系统(中国人)处理代码
翻译效率比较高  百度翻译(python解释器)  

c 编译安装过程
make install


yum安装

使用官方yum源进行安装 安装的是最新版本 软件目录结构比较标准 (推荐)
使用非官方yum源进行安装 安装的不是最新版 目录结构会发生变化

官方yum


yum官方源安装方法:
第一个历程: 更新nginx官方yum源,

vim /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

第二个历程: yum安装nginx软件

yum install -y nginx

第三个历程: 启动nginx服务,检查服务是否安装正确

systemctl start nginx
systemctl enable nginx

测试访问nginx服务

nginx目录结构

[root@localhost ~]# rpm -ql nginx
/etc/logrotate.d/nginx    #nginx日期切割脚本(被rsyslog托管)
/etc/nginx                #nginx的配置文件主目录
/etc/nginx/conf.d         #附加配置文件目录
/etc/nginx/conf.d/default.conf  #nginx初始提供的默认子配置文件
/etc/nginx/fastcgi_params  #定义了一些与fastcgi协议有关的变量的配置文件
/etc/nginx/koi-utf          #与编码相关的配置文件(不懂就保持默认,不要随便更改和删除)
/etc/nginx/koi-win          #与编码相关的配置文件(不懂就保持默认,不要随便更改和删除)
/etc/nginx/mime.types (能识别哪些文件类型)
#nginx的mime文件(定义文件类型和映射关系的,具体涉及到http相应报文中的属性值)
/etc/nginx/modules          #nginx模块文件安装路径(是一个链接文件,实际指向/usr/lib64/nginx/modules)
/etc/nginx/nginx.conf       #nginx的主配置文件
/etc/nginx/scgi_params      #定义了一些与scgi协议有关的变量的配置文件
/etc/nginx/uwsgi_params     #定义了一些与uwsgi协议有关的变量的配置文件
/etc/nginx/win-utf          #与编码相关的配置文件(不懂就保持默认,不要随便更改和删除)
/etc/sysconfig/nginx        #定义一些与nginx有关变量设置的配置文件(可能与管理脚本有关的配置文件)
/etc/sysconfig/nginx-debug  #定义了nginx运行与调试模式下,与nginx有关变量设置的配置文件(可能与管理脚本有关的配置文件)
/usr/lib/systemd/system/nginx-debug.service #托管于systemd管理的运行与调试模式下的服务脚本(nginx调试模式的unit文件)
/usr/lib/systemd/system/nginx.service       #托管于systemd管理的nginx的服务脚本(nginx的unit文件)
/usr/lib64/nginx                            #nginx模块文件主目录
/usr/lib64/nginx/modules                    #nginx的模块文件目录
/usr/libexec/initscripts/legacy-actions/nginx  #nginx自己提供一些功能脚本目录(特殊作用的)
/usr/libexec/initscripts/legacy-actions/nginx/check-reload  #检测nginx服务载入是否异常的脚本
/usr/libexec/initscripts/legacy-actions/nginx/upgrade   #与nginx升级相关的脚本
/usr/sbin/nginx                             #nginx主程序文件
/usr/sbin/nginx-debug                       #nginx运行于调试模式下的住程序文件
/usr/share/doc/nginx-1.14.1                 #nginx的文档路径
/usr/share/doc/nginx-1.14.1/COPYRIGHT       #版权说明相关的配置文件
/usr/share/man/man8/nginx.8.gz              #nginx的man手册文件
/usr/share/nginx                            #nginx的默认站点路径
/usr/share/nginx/html                       #nginx默认提供的html文件的路径
/usr/share/nginx/html/50x.html              #50x状态码相应的html文件
/usr/share/nginx/html/index.html            #默认的主页文件
/var/cache/nginx                            #nginx缓存相关的路径
/var/log/nginx                              #nginx的日志记录的路径

重要:

  1. /etc/nginx 配置文件
  2. /var/log/nginx 日志文件
  3. /usr/bin/nginx 命令文件
  4. /usr/share/nginx/html 站点目录???
    图片 附件信息 音频 视频

日志切割 /etc/logrotate.d

实现nginx日志文件定时切割处理


日志切割方法一: 利用脚本实现切割

#!/bin/bash

mv /var/log/nginx/access.log  /var/log/nginx/access_$(date +%F).log
systemctl restart nginx



日志切割方法二: 利用专用文件切割程序--logrotate
https://zhuanlan.zhihu.com/p/24880144
https://blog.csdn.net/forthemyth/article/details/44062529
切割权限问题:
https://blog.csdn.net/weixin_33878457/article/details/91966448

vim /etc/logrotate.conf
# rotate log files weekly
weekly                     --- 定义默认日志切割的周期

# keep 4 weeks worth of backlogs
rotate 4                   --- 定义只保留几个切割后的文件

# create new (empty) log files after rotating old ones
create                     --- 创建出一个相同的源文件

# use date as a suffix of the rotated file
dateext                    --- 定义角标(扩展名称信息)

# uncomment this if you want your log files compressed
#compress                  --- 是否对切割后的文件进行压缩处理

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d   --- 加载包含/etc/logrotate.d/目录中文件配置

# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {            --- 单独对某个文件进行切割配置
   monthly
   create 0664 root utmp
      minsize 1M             --- 最小大小为1M,小于1M不进行切割              
   rotate 1
}

/var/log/btmp {
   missingok
   monthly
   create 0600 root utmp
   rotate 1
}

nginx服务配置文件

/etc/nginx/nginx.conf --- 主配置文件
删除掉空行便于阅读
grep -v "^$" nginx.conf.bak > nginx.conf

第一个部分: 配置文件主区域配置
user  www;                   --- 定义worker进程管理的用户
补充: nginx的进程
master process:  主进程        ---管理服务是否能够正常运行   boss
worker process:  工作进程   ---处理用户的访问请求         员工  
worker_processes  2;        ---定义有几个worker进程  == CPU核数 / 核数的2倍
error_log  /var/log/nginx/error.log warn;   --- 定义错误日志路径信息
pid        /var/run/nginx.pid;              --- 定义pid文件路径信息

第二个部分: 配置文件事件区域
events {                    
    worker_connections  1024;   --- 一个worker进程可以同时接收1024访问请求
}

第三个部分: 配置http区域
http {
    include       /etc/nginx/mime.types;      --- 加载一个配置文件
    default_type  application/octet-stream;   --- 指定默认识别文件类型
    log_format  oldboy  '$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  oldboy;
                      --- 指定日志路径          
    sendfile        on;   ???
    #tcp_nopush     on;   ???
    keepalive_timeout  65;   --- 超时时间
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;        --- 加载一个配置文件
}



/etc/nginx/nginx.d/default --- 扩展配置(虚拟主机配置文件)

第四个部分: server区域信息(配置一个网站 www/bbs/blog -- 一个虚拟主机)
server {
    listen       8080;                --- 指定监听的端口
    server_name  www.oldboy.com;      --- 指定网站域名                     
    root   /usr/share/nginx/html;     --- 定义站点目录的位置
    index  index.html index.htm;      --- 定义首页文件
    error_page   500 502 503 504  /50x.html;   --- 优雅显示页面信息
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

nginx服务一些常见应用 (模块功能)

nginx服务的企业应用

利用nginx服务搭建一个网站(www)



第一个历程: 编写虚拟主机配置文件

cd /etc/nginx/conf.d/
vim www.conf
server {
   listen        80;
   server_name   www.oldboy.com;
   location  /oldboy {
     root  /usr/share/nginx/html;
     index oldboy.html;
   }
}

location解释day39_03



第二个历程: 需要获取开发人员编写的网站代码

<html>
  <meta charset="utf-8">
  <head>
    <title>00000标题000000</title>
  </head>
  <body>
    test00000000000001
    <table border=1>
      <tr> <td>01</td> <td>oldboy</td> </tr>
      <tr> <td>02</td> <td>oldgirl</td> </tr>
      <tr> <td>03</td> <td>olddog</td> </tr>
    </table>
    <a href="http://blog.oldboyedu.com">
      <img src="oldboy.jpg" />
    </a>
   </body>
</html>

第三个历程: 重启nginx服务(平滑重启)
两种方法:

systemctl reload nginx 
nginx -s reload

nginx命令参数

-t: test configuration and exit
    检查测试配置文件语法
-s: send signal to a master process: stop, quit, reopen, reload
    控制服务停止或者重新启动

第四个历程: 编写DNS配置信息


真实域名: 在阿里云上进行DNS解析记录配置
模拟域名: 在windows主机的hosts文件中进行配置即可
C:\Windows\System32\drivers\etc\hosts


第五个历程: 进行测试访问
浏览器中: http://www.oldboy.com

部署搭建网站常见错误:

01. 网站服务配置文件编写不正确
    404 错误
    解决方法一: 修改nginx配置文件---location
    解决方法二: 在站点目录中创建相应目录或文件数据信息
    403 错误
    解决方法一: 不要禁止访问
    解决方法二: 因为没有首页文件

02. DNS信息配置不正确

03. nginx配置文件修改一定要重启服务;
    站点目录中代码文件信息调整,不需要重启服务


利用nginx服务搭建多网站



www bbs blog

第一个历程: 创建多个虚拟主机配置文件

    bbs.conf
    server {
       listen        80;
       server_name   bbs.oldboy.com;
       location  / {
         root  /html/bbs;
         index index.html;
       }
    }
    blog.conf
    server {
       listen        80;
       server_name   blog.oldboy.com;
       location  / {
         root  /html/blog;
         index index.html;
       }
    }
    www.conf
    server {
       listen        80;
       server_name   www.oldboy.com;
       location  / {
         root  /html/www;
         index index.html;
       }
    }
    systemctl reload nginx

第二个历程: 创建站点目录和目录中首页文件

[root@web01 conf.d]# mkdir /html/{www,bbs,blog} -p
[root@web01 conf.d]# for name in {www,bbs,blog};do echo "10.0.0.7 $name.oldboy.com" >/html/$name/index.html  ;done
[root@web01 conf.d]# for name in {www,bbs,blog};do cat /html/$name/index.html  ;done
10.0.0.7 www.oldboy.com
10.0.0.7 bbs.oldboy.com
10.0.0.7 blog.oldboy.com

第三个历程: 编写hosts解析文件

10.0.0.7            www.oldboy.com  bbs.oldboy.com blog.oldboy.com

第四个历程: 进行访问测试

  1. 利用windows进行浏览器访问测试
  2. 利用linux进行命令访问测试
    [root@web01 conf.d]# curl www.oldboy.com
    10.0.0.7 www.oldboy.com
    [root@web01 conf.d]# curl bbs.oldboy.com
    10.0.0.7 bbs.oldboy.com
    [root@web01 conf.d]# curl blog.oldboy.com
    10.0.0.7 blog.oldboy.com

企业中虚拟主机访问方式

a 基于域名的方式进行访问(上面)
绑定了多个域名时,如果通过ip访问,想指定先访问哪个虚机,就在nginx.conf中include上面再加个include

#gzip  on;
include /etc/nginx/conf.d/xxx.conf;      
include /etc/nginx/conf.d/*.conf;      



b 基于地址的方式进行访问: (只能用指定地址访问) --- 负载均衡+高可用服务

server {
 listen        10.0.0.7:80;   # 只监听10.0.0.7这块网卡的80端口
 server_name   www.oldboy.com;
 location  / {
   root  /html/www;
   index index.html;
 }
}

PS: 服务配置文件中涉及到地址修改,必须重启nginx服务,不能平滑重启

c 基于端口的方式进行访问: zabbix服务(apache:80) + web服务(nginx:80) --> 主机

    server {
       listen        8080;
       server_name   www.oldboy.com;
       location  / {
         root  /html/www;
         index index.html;
       }
    }


网站页面的访问原理

01. 将域名进行解析   www.oldboy.com  --- 10.0.0.7
02. 建立TCP的连接(四层协议)
    10.0.0.7   目标端口   8080
03. 根据应用层HTTP协议发出请求
    请求报文: hosts: bbs.oldboy.com
04. 没有相同域名的server主机,会找满足端口要求的第一个主机
    显示主机的网站页面   

企业中网站的安全访问配置

根据用户访问的地址进行控制



10.0.0.0/24 www.oldboy.com/AV/ 不能访问
172.16.1.0/24 www.oldboy.com/AV/ 可以访问


nginx访问模块: ngx_http_access_module
举例配置:

      location / {
          deny  192.168.1.1;
          allow 192.168.1.0/24;
          allow 10.1.1.0/16;
          allow 2001:0db8::/32;
          deny  all;
      }



指令用法

      Syntax:   deny address | CIDR | unix: | all;
      Default:  —
      Context:  http, server, location, limit_except

第一个历程: 编写配置文件

  [root@web01 conf.d]# vim www.conf 
  server {
     listen        80;
     server_name   www.oldboy.com;
     location / {
       root  /html/www;
       index index.html;
     }
     location /AV {
       deny  10.0.0.0/24;
       allow 172.16.1.0/24;
       root  /html/www;
       index index.html;
     }
  }

补充:
location外面的信息, 全局配置信息
location里面的信息, 局部配置信息

根据用户访问进行认证

nginx认证模块: ngx_http_auth_basic_module
举例配置:

location / {
 auth_basic           "closed site";    --- 开启认证功能
 auth_basic_user_file conf/htpasswd;    --- 加载用户密码文件
}

第一个历程: 编写虚拟主机配置文件

server {
 listen        80;
 server_name   www.oldboy.com;
 location / {
   root  /html/www;
   index index.html;
   auth_basic      "oldboy-sz-01";
   auth_basic_user_file password/htpasswd;   # 相对于/etc/nginx/
 }  

第二个历程: 创建密码文件(文件中密码信息必须是密文的)
htpasswd 创建一个有密文信息的密码文件

[root@web01 conf.d]# rpm -qf `which htpasswd` 
httpd-tools-2.4.6-89.el7.centos.x86_64

[root@web01 /etc/nginx/password]#  htpasswd -cb ./htpasswd root 123456
Adding password for user root

修改密码文件权限: ???

chmod 600 ./htpasswd 
权限更改为worker进程的属主

否则
500 Internal Server Error

  1. 内部程序代码编写有问题
  2. 程序服务中文件权限不正确


    curl命令参数:
    -u, --user USER[:PASSWORD] Server user and password


    登录验证

    [root@web01 password]# curl www.oldboy.com -u oldboy
    Enter host password for user 'oldboy':
    10.0.0.7 www.oldboy.com
    [root@web01 password]# curl www.oldboy.com -u oldboy:123456
    10.0.0.7 www.oldboy.com



    htpasswd命令参数说明:

    -c  Create a new file.  *****
      创建一个密码文件
    -n  Don't update file; display results on stdout.
      不会更新文件; 显示文件内容信息
    -b  Use the password from the command line rather than prompting for it. *****
      免交互方式输入用户密码信息
    -i  Read password from stdin without verification (for script usage).
      读取密码采用标准输入方式,并不做检查 ???
    -m  Force MD5 encryption of the password (default).
      md5的加密算法
    -B  Force bcrypt encryption of the password (very secure).
      使用bcrypt对密码进行加密  
    -C  Set the computing time used for the bcrypt algorithm
      (higher is more secure but slower, default: 5, valid: 4 to 31).
      使用bcrypt algorithm对密码进行加密
    -d  Force CRYPT encryption of the password (8 chars max, insecure).
      密码加密方式
    -s  Force SHA encryption of the password (insecure).
      加密方式
    -p  Do not encrypt the password (plaintext, insecure).
      不进行加密
    -D  Delete the specified user.
      删除指定用户
    -v  Verify password for the specified user.

利用nginx服务搭建网站文件共享服务器


nginx模块功能: ngx_http_autoindex_module


第一个步骤: 编写配置文件(www.conf)

Syntax: autoindex on | off;
Default:    
autoindex off;
Context:    http, server, location

server {
   listen        80;
   server_name   www.oldboy.com;
   location / {
     root  /html/www;
     auth_basic      "oldboy-sz-01";
     auth_basic_user_file password/htpasswd;
     autoindex on;    --- 开启nginx站点目录索引功能
}

PS:

  1. 需要将首页文件进行删除
  2. mime.types媒体资源类型文件作用
    文件中有的扩展名信息资源, 进行访问时会直接看到数据信息
    文件中没有的扩展名信息资源, 进行访问时会直接下载资源
    如,想直接下载txt文件,就把txt删掉


    网站页面目录数据,中文出现乱码,如何解决:

    location / {
       root  /html/www;
       #index index.html;
       auth_basic      "oldboy-sz-01";
       auth_basic_user_file password/htpasswd;
       autoindex on;
       charset utf-8;   --- 修改目录结构中出现的中文乱码问题
     }


利用nginx服务搭配置文件别名功能

第一个历程: 编写配置文件

server_name   www.oldboy.com old.com;



第二个历程: 配置好解析信息


作用:

  1. 编写网站访问测试
  2. 定位要访问的网站服务器

利用nginx状态模块功能对网站进行监控


http://www.ttlsa.com/nginx/nginx-status-detail/
状态模块: ngx_http_stub_status_module

location = /basic_status {
    stub_status;
}



第一个历程: 编写配置文件

[root@web01 conf.d]# vim state.conf
server {
   listen    80;
   server_name  state.oldboy.com;
   stub_status;
}   

第二个历程: 重启nginx服务,并且编写解析文件

    systemctl reload nginx 
    10.0.0.7     state.oldboy.com

状态页解释

Active connections:  激活的连接数信息  4000用户  3500
accepts: 接收的连接数汇总(综合)  TCP
handled: 处理的连接数汇总(综合)  TCP
requests: 总计的请求数量  HTTP协议请求 
Reading: nginx服务读取请求报文的数量    100人点餐
Writing: nginx服务响应报文信息数量      100人响应
Waiting: nginx队列机制,要处理(读取或者响应保存进行保存)   监控

nginx日志功能配置

默认访问日志: /var/log/nginx/access.log ngx_http_log_module
定义日志内容格式(主配置文件)

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '`
                '$status $body_bytes_sent "$http_referer" '
                '"$http_user_agent" "$http_x_forwarded_for"';

#   $remote_addr            显示用户访问源IP地址信息
#    $remote_user            显示认证的用户名信息
#   [$time_local]           显示访问网站时间
#   "$request"              请求报文的请求行信息
#    $status                 用户访问网站状态码信息
#   $body_bytes_sent        显示响应的数据尺寸信息
#   $http_referer           记录调用网站资源的连接地址信息(防止用户盗链)                    
#   $http_user_agent        记录用户使用什么客户端软件进行访问页面的  (谷歌 火狐 IE 安卓 iphone)
#   $http_x_forwarded_for   ??? 负载均衡

虚拟主机配置文件中可单独配置日志:
access_log /var/log/nginx/access.log main; 调用日志格式




错误日志: /var/log/nginx/error.log --- Core functionality

Syntax:     error_log file [level];  指定错误日志路径以及错误日志记录的级别
Default:    error_log logs/error.log error;
Context:    main, http, mail, stream, server, location



错误级别:
默认error_log /var/log/nginx/error.log warn;


debug :调试级别, 服务运行的状态信息和错误信息详细显示 信息越多
info :信息级别, 只显示重要的运行信息和错误信息
notice :通知级别: 更加重要的信息进行通知说明
warn :警告级别: 可能出现了一些错误信息,但不影响服务运行
error :错误级别: 服务运行已经出现了错误,需要进行纠正 推荐选择
crit :严重级别: 必须进行修改调整
alert :严重警告级别: 即警告,而且必须进行错误修改
emerg :灾难级别: 服务已经不能正常运行 信息越少


PS: 日志文件信息需要做切割处理 新版本yum安装的通过lograte自动切割了,老版本可能需要手动切割

nginx服务location作用说明

模块说明: ngx_http_core_module
location进行匹配(uri)


错误页面优雅显示

location /oldboy {
   root /html/www;
   error_page  404  /oldboy.jpg;
}
location /oldgirl {
   root /html/www;
   error_page  404  /oldgirl.jpg;
}



location详细配置:

    Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
            location @name { ... }
    Default:    —
    Context:    server, location

    location = / {              --- 精确匹配    优先级01 最高
    [ configuration A ]
    }

    location / {                --- 默认匹配    优先级04 最低
        [ configuration B ]
    }

    location /documents/ {      --- 按照目录进行匹配    优先级03
        [ configuration C ]
    }

    location ^~ /images/ {      --- 优先匹配/不识别uri信息中符号信息       优先级02
        [ configuration D ]
    }

    location ~* \.(gif|jpg|jpeg)$ {  --- 不区分大小写进行匹配(不带*区分大小写)  优先级03
        [ configuration E ]
    }

利用nginx实现页面跳转功能

利用rewrite模块是跳转功能: http_rewrite_module

Syntax: rewrite regex replacement [flag];   rewite  匹配的正则信息  替换成什么信息
Default:    —
Context:    server, location, if

rewrite www.oldboy.com/(.*) http://www.oldboy.com/$1 permanent;   重写规则配置
    ^/        (.*)
baidu.com    /  oldboy.html                  跳转方式

www.baidu.com/oldboy.html



跳转方式:
永久跳转: permanent 301 会将跳转信息进项缓存
临时跳转: redirect 302 不会缓存跳转信息



出现无限跳转如何解决:
第一种方法: 利用不同server区块配置打破循环

server {
   server_name  oldboy.com;
   rewrite ^/(.*) http://www.oldboy.com/$1 permanent;
}

server {
   listen        80;
   server_name   www.oldboy.com;
   ......

第二种方法: 利用if判断实现打破循环

server {
   listen        80;
   server_name   oldboy.com www.oldboy.com;

   if ($host ~* "^oldboy.com$") {
     rewrite ^/(.*) http://www.oldboy.com/$1 permanent;
   }

通过rewrite可以把长地址跳转为短地址www.oldboy.com/oldboy01/oldboy02/oldboy.jpg --- www.oldboy.com/oldboy.jpg

服务器技术交流群请加微信 YJZyjz