一、web server

常见的web服务器有apache、nginx、lighttpd、tomcat等。

  • apache 世界主流的web服务器,大部分网站都是它搭建的,优势开放源代码;属于重量级产品,功能模块化定制,消耗资源大,性能稍弱于nginx。
  • lighttpd 一款高性能、高安全、快速且配置灵活的web服务器产品,转为高流量的网站设计,相比其他服务器占用内存极小,能够提供有效的API接口、支持CPU管理、后台转发等操作。
  • tomcat 一个开源的运行基于Java的一个web应用服务器,主要根据serverlet进行执行,但是tomcat对于平台文件、静态文件、高并发处理还是比较弱。
  • nginx 一款高性能HTTP web服务器、支持方向代理、负载均衡等功能;nginx是以高效的Linux网络模型,epoll、event作为网络IO模型的,在高并发情况下轻松支持5W+的并发流量,而且消耗的内存、CPU等资源也是很低的,运行起来非常稳。
    • 低成本 软件负载均衡技术、支持bsd开源许可协议
    • 支持网站URL重写 根据url的特点,进行一个请求转发,判断(七层负载均衡)
    • 支持高可用配置 防止单点故障,服务器奔溃
    • 节省网络带宽,支持静态文件压缩后传输,支持gzip压缩功能
    • 支持热部署,可以在不停止的nginx情况下更新代码
      1. [root@ylin ~]# curl -I pythonav.cn #可以抓取服务器搭建信息
      2. HTTP/1.1 200 OK
      3. Server: nginx/1.12.0
      4. Date: Tue, 02 Feb 2021 13:25:31 GMT
      5. Content-Type: text/html
      6. Content-Length: 24717
      7. Last-Modified: Fri, 22 Jan 2021 03:44:20 GMT
      8. Connection: keep-alive
      9. ETag: "600a4a14-608d"
      10. Accept-Ranges: bytes

      二、nginx网络模型基础

      1、内核空间和用户空间

      操作系统为了保护系统的核心区域(内核),使得用户无法直接修改系统底层,因此操作系统开辟了两块虚拟空间,为内核空间和用户空间;内核空间,独立于普通的应用程序,可以直接操作底层硬件,处理系统受保护的区域。

      2、进程切换

      为了控制进程的执行,操作系统的内核需要有能力挂起CPU上正在运行的程序(暂停CPU正在运行的程序),还能恢复之前已经挂起的程序;这种行为就叫进程切换。

      3、进程阻塞

      正在运行的程序由于某些事情的等待,比如资源加载中、资源加载失败;操作系统就会调用内核的block语句自动的阻塞该进程,让该进程处于阻塞状态。

      4、文件描述符

      文件描述符是一个索引值,指向Linux内核为每个进程打开的文件做记录的一个表;程序每打开一个文件,系统内核就向该进程发送一个文件描述符。

      5、Linux IO模型

      数据的IO操作比如文件的读取,数据优先会被拷贝到操作系统的内核缓冲区,然后在从缓冲区拷贝到应用程序的内存空间。
      本地文件IO过程:等待数据准备,然后从内核空间拷贝到用户进程空间
      网络IP过程:等待网络上的数据分段到达,然后复制到内核的buffer区域,最好数据中内核缓冲区到用户进程空间

      6、常见IO模型

  • 阻塞模型
    • 同步阻塞IO(block IO),IO执行的两个阶段都是阻塞的,用户空间发起调用,内核准备数据时阻塞;内核拷贝数据到内核空间此时阻塞;直到最终内核返回结果,数据拷贝完成,用户进程结束block状态,用户重新运行。
    • 在Linux默认的情况下,所有的socket套件字操作都是阻塞的,阻塞指的是进程在等待中,CPU去执行别的事情。
    • 同步阻塞模型,主要的优缺点如下:
      • 阻塞IO能够及时返回数据,无延迟
      • 对于开放人员负担较低
      • 对于用户不友好,性能较弱
  • 非阻塞模型
    • 同步非阻塞模型,就是每隔一会检索一次,进行轮训调用的方式;
    • 同步非阻塞模型优缺点:
      • 在等待时间内,可以继续处理其他的任务,当然也包括继续提交新的任务和请求
      • 任务完成的延迟比较大,因为需要多次的发起系统轮训调用操作,并且很可能在轮训的过程中,数据已经准备完毕了,造成延迟对整体的系统吞吐量性能有了降低。
  • IO多路复用
    • 计算机系统后台可能有很多个进程任务,如果能有自动的循环的查询多个任务的进度,而不需要用户主动发起轮训调用,而是有人帮忙来盯着这些进度,这就是IO多路复用技术。因此在Linux系统下,select、poll、epool等函数就是来实现这个功能的,并且epool是nginx采用的IO模型是效率最高的。
  • 异步复用

网络IO是指在网络中进行数据的读、写操作,本质上就是一个socke套接字的读取,socket套接字在Linux系统中被抽象为流的概念,网络IO其实就是对流的处理。

阻塞和非阻塞的区别:
1.阻塞IO会一直阻塞对应的经常,直到数据操作呢完毕
2.非阻塞IO是在内核空间准备数据的阶段会立刻返回

同步IO与异步IO的区别:
1.同步IO在进行IO操作的时候,进程会被阻塞
2.异步IO是在进程发起IO操作之后,内核会直接返回;直到内核发送一个信号,告诉该进程IO操作完成了,整个进程完全没有阻塞的。

三、nginx

nginx版本分为商业版、开源版、淘宝版

1、源码安装

1.源代码手动安装nginx(可以指定路径、开启额外额第三方功能),需要先解决开发编译环境,安装三部曲
[root@ylin ~]# yum install gcc gcc-c++ autoconf automake make -y    
[root@ylin ~]# yum install zlib zlib-devel openssl openssl-devel pcre pcre-devel wget httpd-tools vim -y    #第三方功能依赖库,同时检查配置防火墙、iptables、selinux
编译安装三部曲🐶:
[root@ylin nginx]# wget http://nginx.org/download/nginx-1.19.6.tar.gz    #wget下载
[root@ylin nginx]# tar -zxvf nginx-1.19.6.tar.gz         #解压缩
[root@ylin nginx-1.19.6]# ll
总用量 800
drwxr-xr-x 6 ylin ylin   4096 2月   5 15:24 auto        检测系统模块依赖信息
-rw-r--r-- 1 ylin ylin 308054 12月 15 22:41 CHANGES    存放nginx的变化记录日志
-rw-r--r-- 1 ylin ylin 470256 12月 15 22:41 CHANGES.ru
drwxr-xr-x 2 ylin ylin   4096 2月   5 15:24 conf        存放nginx主配置文件的目录
-rwxr-xr-x 1 ylin ylin   2590 12月 15 22:41 configure    可以执行文件的脚本,用于解释编译文件的定制脚本
drwxr-xr-x 4 ylin ylin   4096 2月   5 15:24 contrib    提供vim,友好颜色区分
drwxr-xr-x 2 ylin ylin   4096 2月   5 15:24 html
-rw-r--r-- 1 ylin ylin   1397 12月 15 22:41 LICENSE
drwxr-xr-x 2 ylin ylin   4096 2月   5 15:24 man
-rw-r--r-- 1 ylin ylin     49 12月 15 22:41 README
drwxr-xr-x 9 ylin ylin   4096 2月   5 15:24 src        存放了源代码库

[root@ylin nginx-1.19.6]# ./configure --help    #查看编译帮助信息,如果需要开启新的模块支持,在此开启
[root@ylin nginx-1.19.6]# ./configure --prefix=/opt/tngx232(安装目录) --with-http_ssl_module --with-http_flv_module  --with-http_gzip_static_module --with-http_stub_status_module --with-threads --with-file-aio            #编译安装开启特定的模块
[root@ylin nginx-1.19.6]# make         #直接make安装
[root@ylin nginx-1.19.6]# make install     #直接执行安装

[root@ylin tngx232]# ll
drwxr-xr-x 2 root root 4096 2月   5 15:51 conf    存放配置文件
drwxr-xr-x 2 root root 4096 2月   5 15:51 html    存放网页根目录文件,站点的静态文件数据
drwxr-xr-x 2 root root 4096 2月   5 15:51 logs    存放nginx的各种日志文件
drwxr-xr-x 2 root root 4096 2月   5 15:51 sbin    存放可执行的命令

2.在进行环境变量的设置
#直接执行nginx命令,表示启动该服务器,如果没有反应是因为未配置环境变量
[root@ylin ~]# echo $PATH                #这是执行命令的环境变量,但是如果环境变量中并没有nginx的命令解释
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@ylin ~]# /opt/ylin_nginx/sbin/nginx         #在安装nginx的目录,使用绝对路径的方式去执行这个命令就可以

#创建一个nginx的专属环境变量文件
[root@ylin /]# vim /etc/profile.d/nginx.sh        #创建nginx的专属的环境变量文件,写入如下内容,注意路径为nginx的安装路径
export PATH="$PATH:/opt/ylin_nginx/sbin"        #需要推出重新登陆才能加载环境变量
[root@ylin ~]# echo $PATH                        #重新登陆之后查看该用户的环境变量是否添加
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/ylin_nginx/sbin:/root/bin

[root@ylin ~]# nginx         #直接执行服务,但是如果非首次执行会报端口被占用的错误,需要停止nginx在执行
[root@ylin ~]# nginx -s stop    #停止nginx服务
[root@ylin ~]# nginx -s reload     #平滑重启,可以在不停止nginx服务的情况下,加载文件         

[root@ylin ~]# nginx -V            #查看编译安装信息
nginx version: nginx/1.19.6
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/opt/ylin_nginx --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-threads --with-file-aio

#配置语法高亮
[root@ylin ~]# mkdir -p ~/.vim            #在home目录中递归创建.vim文件
[root@ylin ~]# cp -r /opt/nginx-1.19.6/contrib/vim/* ~/.vim/            #将源码文件中的contrib中关于vim的文件进行递归拷贝

2、配置文件解读

  • nginx.conf是有指令组成的,指令块可以由大括号组织多条语句
  • 每行语句都得有分号结束,指令和参数之间是有空格组成的
  • nginx.conf使用#号,表示注释符
  • 支持 $变量名 语法,支持include语法,支持正则表达式
    [root@whoami opt]# cat ylin_nginx/conf/nginx.conf |grep -Ev '^[ ]*#|^$'        #去掉空号,空白开头的注释行
    user www    www;                        #修改nginx执行服务的用户,保证服务系统隔离;可以通过ps -ef 查看
    worker_processes  1;            #nginx的工作进程数,一般优化配置为cpu总核心数
    events {
      worker_connections  1024;
    }
    http {
      include       mime.types;
      default_type  application/octet-stream;
      sendfile        on;
      keepalive_timeout  65;
      server {
          listen       80;
          server_name  localhost;
          location / {
              root   html;
              index  index.html index.htm;
          }
          error_page   500 502 503 504  /50x.html;
          location = /50x.html {
              root   html;
          }
      }
    }
    

    3、命令行和信号传递

    ``` 1.nginx的启停服务 nginx #初次启动,直接入输入该命令,但是如果在此执行该命令,将会提示端口冲突 nginx -s stop #停止nginx进程 nginx -s reload #平滑重启,利用reload可以在不重启nginx的情况下,重新读取配置文件

2.查看nginx的帮助信息 [root@whoami ~]# nginx -h nginx version: nginx/1.19.6 Usage: nginx [-?hvVtTq] [-s signal] [-p prefix] [-e filename] [-c filename] [-g directives]

Options: -?,-h : this help #查看帮助 -v : show version and exit #查看版本号 -V : show version and configure options then exit #版本信息和编译参数信息 -t : test configuration and exit #检测nginx的配置文件,语法是否正确 -T : test configuration, dump it and exit #检查配置输入配置信息 -q : suppress non-error messages during configuration testing #在检查配置文件间,屏蔽非错误信息 -s signal : send signal to a master process: stop, quit, reopen, reload

给nginx主进程发送一个主信号,分别有stop 停止 quit 优雅的停止 reopen 重新记录日志文件 reload 重读配置文件

-p prefix : set prefix path (default: /opt/ylin_nginx/) #设置nginx的目录前缀 -e filename : set error log file (default: logs/error.log)
-c filename : set configuration file (default: conf/nginx.conf) #指定配置文件启动 -g directives : set global directives out of configuration file

```
[root@whoami ~]# ps -ef |grep nginx |grep -v grep            #检查当前nginx的进程
root      1357     1  0 09:06 ?        00:00:00 nginx: master process nginx        #nginx主进程,负责nginx的请求分发给worker进程的
www       1467  1357  0 09:14 ?        00:00:00 nginx: worker process                    #nginx的工作进程,负责进程处理的,由worker_processes配置参数决定

image.png

1.master主进程是不处理请求的,而是分配请求给worker进程,主进程负责重启,热加载,热部署等
2.master是根据nginx.conf中的work_process定义启动时创建的工作进程数的
3.当worker运行后,master就处于一个等待的状态,等待用户的请求来临,或者系统信号来临
4.系统管理员可以发送nginx -s信号操作nginx
nginx -s对应的信号功能如下
参数            信号            含义
stop         TERM            强制关闭nginx服务
null        INT                强制关闭整个nginx服务
quit        QUIT            优雅的关闭整个服务
reopen    USR1            重新打开日志记录
reload    HUB                重新读取配置文件,并且优雅的退出旧的worker进程

4、热部署功能

在不重启或者关闭进程的情况下,新的应用直接替换旧的应用
在不影响用户体验的情况下,进行软件版本的升级,也就是不主动杀死worker,就能够替换二进制文件
reload重载仅仅是nginx的master进程,在检查配置文件之后,配置文件正确则更新,错误则返回异常;正确的情况下也不会更改已经建立的worker进程,只会等待worker进程处理完毕请求之后,杀死旧的worker。然后在从新的配置文件中,运行处新的worker(一旦更换了配置文件,reload master主进程,那么手底下的worker进程就会换一批了)

热部署大致流程:
1.备份旧的程序    二进制文件
2.编译安装新的而进程文件,覆盖旧的二进制文件(在装一个版本的nginx,且替换旧的nginx)
3.发送USR2信号给旧的master进程
4.发送WINCH信号给旧的master进程
5.发送QUIT信号给旧的master进程
1.查看当前nginx的版本信息
[root@whoami ~]# nginx -v
nginx version: nginx/1.19.6

2.备份旧的二进制命令
[root@whoami sbin]# ls
nginx
[root@whoami sbin]# mv nginx nginx_1.19.6

3.查看旧的二进制命令的编译参数
[root@whoami sbin]# nginx_1.19.6 -V            #由于二进制命令备份所以执行命令需要注意
nginx version: nginx/1.19.6
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/opt/ylin_nginx --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-threads --with-file-aio

4.下载编译新版本的nginx,解压缩,编译安装,编译参数需要和旧版一致
wget+编译三部曲
[root@whoami nginx-1.16.1]# ./configure --prefix=/opt/ylin_nginx --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-threads --with-file-aio
[root@whoami nginx-1.16.1]# make && make install        #上一个命令执行成功,在执行下一个命令

5.检查新版的nginx信息,发现已经由两个版本的nginx命令
[root@whoami nginx-1.16.1]# cd ../ylin_nginx/sbin/
[root@whoami sbin]# ls
nginx  nginx_1.19.6

6.查看当前nginx系统的状态        #启动nginx需要以绝对路径进行启动不然热部署会出错
[root@whoami sbin]# ps -ef |grep nginx #通过PID(子进程)PPID(父进程)可以验证worker进程是由master进程创建的
root     12948     1  0 11:35 ?        00:00:00 nginx: master process /opt/ylin_nginx/sbin/nginx
nobody   12949 12948  0 11:35 ?        00:00:00 nginx: worker process

7.发送一个USR2信号给旧的master进程,作用是使得nginx旧的版本停止接收用户请求,并且切换为新的nginx版本
[root@whoami sbin]# kill -USR2 `cat /opt/ylin_nginx/logs/nginx.pid`    #执行命令发送给旧的nginx
执行完上述的结果,nginx-master旧的主进程,会重新命名染的pid文件,然后添加上.oldbin后缀
[root@whoami sbin]# ls ../logs/
access.log  error.log  nginx.pid  nginx.pid.oldbin
然后会启动一个新的master主进程,以及worker,使用的是新版本的nginx二进制命令;此时新的nginx就能够自动的接收用户发来的请求,过渡到新的nginx-master上工作,因此实现一个平滑过渡

8.在次查看进程,发现新的nginx进程的父进程为之前老的nginx文件
[root@whoami sbin]# ps -ef |grep nginx
root     12948     1  0 11:35 ?        00:00:00 nginx: master process /opt/ylin_nginx/sbin/nginx
nobody   12949 12948  0 11:35 ?        00:00:00 nginx: worker process
root     15691 12948  0 11:38 ?        00:00:00 nginx: master process /opt/ylin_nginx/sbin/nginx
nobody   15692 15691  0 11:38 ?        00:00:00 nginx: worker process

9.此时发送WINCH信号,给旧的master进程,让旧的master进程优雅的退出
[root@whoami ~]# kill -WINCH `cat  /opt/ylin_nginx/logs/nginx.pid.oldbin`    #只会保留旧的master进程,改进程在切换之后运行正常也可通过kill杀死
[root@whoami ~]# ps -ef |grep nginx
root     12948     1  0 11:35 ?        00:00:00 nginx: master process /opt/ylin_nginx/sbin/nginx
root     15691 12948  0 11:38 ?        00:00:00 nginx: master process /opt/ylin_nginx/sbin/nginx
nobody   15692 15691  0 11:38 ?        00:00:00 nginx: worker process
[root@whoami ~]# kill 12948
[root@whoami ~]# ps -ef |grep nginx
root     15691     1  0 11:38 ?        00:00:00 nginx: master process /opt/ylin_nginx/sbin/nginx
nobody   15692 15691  0 11:38 ?        00:00:00 nginx: worker process

5、日志定时切割功能

能够控制单个日志文件的大小,便于对日志进行管理

[root@whoami logs]# ab -kc 10 -n 10 http://127.0.0.1/        #使用AB命令请求
[root@whoami ~]# tail -f /opt/ylin_nginx/logs/access.log     #实时动态查看

[root@whoami logs]# ll -h            #日志文件记录
总用量 12K
-rw-r--r-- 1 root root 3.4K 2月  10 14:09 access.log
-rw-r--r-- 1 root root  653 2月  10 13:43 error.log
-rw-r--r-- 1 root root    6 2月  10 11:38 nginx.pid

1.针对原日志文件重命名,注意一定要使用mv命令
[root@whoami logs]# mv access.log "access.log_$(date +"%Y-%m-%d")"

2.发送信号给nginx主进程,给他发送一个重新打开的信号,让nginx生成新的日志文件
[root@whoami logs]# nginx -s reopen        #等同于 kill -USR1 `cat nginx.pid`
#由于nginx的工作模式特点,master下发指令给worker去执行,所以需要等待一下在执行对文件修改操作

3.定时任务执行操作
[root@whoami myscripts]# cat cut_nginx_log.sh 
#!bin/bash
#脚本写入crontab,每天0点之下,这是一个nginx日志切割的脚本

#nginx日志存放点
logs_path="/opt/ylin_nginx/logs/"
mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")
mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/access_$(date -d "yesterday" +"%Y-%m-%d").log
nginx -s reopen

bash cut_nginx_log.sh测试脚本是否正确
[root@whoami logs]# tree        #查看生成文件
.
├── 2021
│   ├── 02
│   │   └── access_2021-02-09.log
│   └── access_.log
├── access.log
├── access.log_2021-02-10
├── error.log
└── nginx.pid

[root@whoami myscripts]# crontab -l        #添加定时任务
0 0 * * * /bin/bash /myscripts/cut_nginx_log.sh

6、虚拟主机功能

虚拟主机指的就是一个独立的站点配置,是nginx默认支持的一个功能,它能够有自己独立的域名,独立的IP,独立的端口配置,能够配置完整的www服务,例如网站搭建,FTP服务搭建,邮件服务器代理等等。
并且nginx支持多虚拟主机,可以在一台机器上,同时运行多个网站的功能。
nginx的多虚拟主机,可以基于多域名的形式、多IP的形式、多端口的形式
在nginx中虚拟主机通过server定义,默认至上而下进行匹配

    server {
            #定义虚拟主机站点的端口号,也是用户访问的入口
        listen       80; 
        #填写虚拟主机的域名配置,没有域名就可以写localhost或者_也许
        #server_name  www.baidu.com
        server_name  localhost;
                #定义网站的编码
        charset utf-8
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #nginx的匹配规则
        #如下为最低级的匹配规则,任何请求都会被匹配中location的配置,去它所定义的目录中去寻找资料
        location / {
                #root关键词是定义网页根目录的,这个html是以nginx安装的路径为相对路径的
            root   html;            #根站点文件在此修改,例如 /www/index.html
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
基于IP、端口、域名的多虚拟主机
[root@whoami ~]# ifconfig eth0:1 10.0.0.1 netmask 255.255.255.0  broadcast 10.0.0.255    #添加IP地址

#########nginx-test                #修改hosts文件,实现本地域名解析
39.101.67.62    www.ylin.com
39.101.67.62    www.ylin2.com


通过include语法,导入虚拟主机配置,在导入配置文件中写入关于虚拟主机的内容
include  extra/*.conf;                    #添加在http标签首行,当前路径默认为conf下

[root@whoami extra]# cat ylin2.conf     #添加虚拟主机配置,基于域名的,如果是端口修改端口即可
server {
  listen 80;
  server_name www.ylin2.com;
location / {
     root /www/ylin2;
    index index.html;
 }
}

[root@whoami extra]# nginx -t                #检查语法是否报错
nginx: the configuration file /opt/ylin_nginx/conf/nginx.conf syntax is ok
nginx: configuration file /opt/ylin_nginx/conf/nginx.conf test is successful
[root@whoami extra]# nginx -s reload        #热加载
多虚拟主机日志功能,为了方便管理针对每个虚拟主机都生成单独的日志文件,需要在对应的虚拟主机的配置文件中修改
[root@whoami extra]# cat ylin2.conf 
server {
  listen 31943;
  server_name _;
  access_log logs/ylin2_access.log;                    #添加日志路径、日志名,需要reload服务
location / {
     root /www/ylin2;
    index index.html;
 }
}

7、静态资源压缩功能

nginx支持gzip压缩功能,经过gzip压缩之后的页面,图片,动态图这类的静态文件,能够压缩为原本的30%甚至更小,用户访问网站的体验会好很多

nginx.conf开启gzip压缩功能,添加如下语句,针对静态资源压缩,添加在server语句之前
        gzip on;                        #开启该功能
        gzip_http_version 1.1;            #版本
        gzip_comp_level 4;                    #压缩等级,数字越小压缩等级越高,CPU消耗越大
        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;        #能压缩的类型

#需要重载nginx
nginx -s reload

8、access日志功能

只需要在nginx主配置文件中修改log参数即可

    #定义日志格式
    #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;
    #日志信息如下:
    223.104.96.189 - - [19/Feb/2021:15:08:36 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36"

9、Nginx目录浏览功能

能够将机器上的目录资料,提供一个展示,无论是谁都可以快速访问;此功能在虚拟主机上配置的

配置如下:
server {
  listen 31943;
  server_name _;
  access_log logs/ylin2_access.log;
location / { 
        root /www/ylin2;
        #index index.html;    #需要注释掉主网页文件,同时修改目录配置中的ylin2中的index.html文件
        autoindex on;
 }
}

10、Nginx状态页

nginx提供了status模块,用于检测nginx的请求连接信息,需要—with-http_stub_status_module模块参数支持才可以使用,可以通过nginx -V进行查看,通过添加一个status.conf配置文件,用于检测连接信息

创建status.conf文件,添加如下内容即可,需要被主配置文件读取,可以通过include添加
[root@whoami extra]# cat status.conf 
server{
 listen 31943;
 location / {
    stub_status on;        #开启状态页功能
    access_log off;        #关闭访客日志功能
 }
}

11、错误日志功能

nginx针对虚拟主机需要指定单独的访问错误日志文件,针对服务器的错误日志文件存储在error.log中

error_log logs/web_error.log;        #在虚拟主机配置文件中添加对于参数即可,默认日志级别为error

12、location匹配规则

location根据用户访问的URL,进行不同方式的处理

语法
location [ = | ~ | ~* | ^~ ] url {
     #动作
}
nginx有关的location的匹配规则,符号优先级如下(数字越小优先级越大)
=                精确匹配        优先级 1
^~       以某个字符开头,不做正则处理        2
~*            支持正则匹配模式            3
/blog/    访问IP/blog/时匹配        4
/                缺省匹配规则                    5
[root@bogon extra]# cat www.conf
server {
    listen 31943;
    server_name _;

    #优先级最高
    location = / {
        return 402;            #可以写访问的目录和网页文件
}
    #匹配任何以/img/开头的请求,不匹配正则
    location ^~ /img/ {
        return 404;
}
    #匹配任何以.gif结尾的请求,支持正则
    location ~* \.(gif|jpg|jpeg)$ {
        return 500;
}
    #以/blog/开头的url,来这里,如符合其他locaiton,则以其他优先
    location /blog/ {
        return 403;
}
    #最低级匹配,不符合其他locaiton就来这
    location / {
        return 401;
}
}

13、Nginx的URL重写

Nginx的URL地址重写功能,主要是使用nginx提供的rewrite功能,支持正则表达式
rewrite能够实现URL的跳转,实现URL规范化,根据请求的变量实现URL跳转等等,基于URL重写功能可以实现如下:

  • 对于爬虫程序的封禁,让其跳转到一个错误的页面
  • 动态的URL,伪装成静态的html页面,便于搜索引擎的抓取
  • 新旧域名的替换

    rewrite 语法
    rewrite ^/(.*) http://www.baidu.com/$1    parmanent;    #添加在location之后,单独生成配置文件
    rewrite    是nginx地址重写的关键词指令,开启跳转的功能
    正则^/(.*)表示匹配所有的请求,匹配成功之后,跳转到后面指定的URL地址
    $1    是指取出前面正则表达式分组括号里面的内容
    parmannent    表示301,永久重定向标记
    

    rewrite结尾的参数标记如下:

  • last 规则匹配之后,继续向下匹配新的location

  • break 本条规则匹配完成后,立即停止匹配动作
  • redirect 返回302临时重定向的状态码,浏览器地址显示跳转后的URL
  • permanent 返回永久重定向,浏览器地址也显示跳转后的URL

last和break用于实现URL重写,浏览器地址不会发生变化;redirect和permanent浏览器URL地址会发生变化,跳转到新的URL地址。

 location / {
            rewrite ^/(.*) http://www.baidu.com/$1 permanent;            #修改参数reload服务,测试
           # root   /www/html;
           # index  index.html index.htm;
 }

14、Nginx访问认证

在访问页面或者文件时,需要进行密码认证才可以访问

语法
location    / {
    auth_basic 'string';
  auth_basic_user_file conf/htpasswd;
}
linux提供了密码生成命令,通过htpasswd命令生成用户名密码        #需要安装httpd-tools才能使用
htpasswd -bc    .access    username password            #-bc创建用户密码、密码文件名
[root@whoami passwd]# htpasswd -bc ./htpasswd ylin love        #生成密码文件

location /blog/ {
        root html/www;
        index index.html;
        auth_basic "ylin passwd";
        auth_basic_user_file /opt//opt/ylin_nginx/conf/passwd/htpasswd;        #密码文件目录
 }

四、LNMP架构搭建

Linux + nginx + mysql + php

lnmp组合搭建,工作流:
1.用户通过浏览器输入域名访问nginx的web服务器。
2.nginx针对用户请求判断(location URL匹配功能),静态请求则nginx直接响应给用户;如果是动态请求(PHP),那么nginx就会通过fastcgi接口把请求转发给PHP后台程序处理(php-fpm进程)。
3.PHP进行动态请求解析(登陆、注册、访问数据库)如果请求还需要访问数据库,就会通过PHP在连接数据库,进行数据请求;数据读取完成之后在返回给nginx,最终nginx把数据响应给用户客户端。

1、源码安装nginx

1.安装nginx前的环境依赖检查及安装
[root@whoami ~]# yum install pcre pcre-devel openssl openssl-devel gcc -y

2.nginx源码下载、解压、安装(可自定义安装路径、第三方扩展功能,yum源安装不形)
[root@whoami mytools]# wget http://nginx.org/download/nginx-1.16.0.tar.gz    #下载
[root@whoami mytools]# tar -zxvf nginx-1.16.0.tar.gz    #解压
[root@whoami home]# useradd nginx -u 1111 -s /bin/nologin -M        #创建运行nginx的用户,保证系统安全;-u 指定UID    -M    不创建家目录
[root@whoami nginx-1.16.0]#./configure --user=nginx --group=nginx --prefix=/opt/nginx-1.16.0/ --with-http_stub_status_module --with-http_ssl_module     #指定运行用户、组,安装路径、第三方组件
[root@whoami nginx-1.16.0]# make && make install    #编译安装
[root@whoami ~]# ln -s /opt/nginx-1.16.0/ nginx        #在家目录配置一个软连接,方便多方人员一起操作

3.配置环境变量
[root@whoami ~]# echo $PATH            #查看当前的环境变量
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PATH="$PATH:/opt/nginx-1.16.0/sbin"        #在原有的环境变量基础上添加nginx的环境变量,写入到/etc/profile中,退出重新登陆才生效
[root@whoami ~]# echo $PATH            #再次查看环境变量是否添加成功
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/nginx-1.16.0/sbin:/root/bin

2、二进制文件安装使用配置mysql

mysql二进制方式安装,把安装好的mysql打包成压缩文件,用户可以解压缩后简单配置即可使用,无需再次安装速度较快,适合DBA使用。 
1.[root@whoami ~]# useradd -s /bin/nologin -M mysql        #创建mysql运行的普通用户,降低程序运行权限
[root@whoami mytools]# wget http://mirrors.163.com/mysql/Downloads/MySQL-5.7/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz            #下载
[root@whoami mytools]# tar -zxvf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz -C /opt/    #解压到指定目录
[root@whoami ~]# ln -s /opt/mysql-5.7.31-linux-glibc2.12-x86_64/ mysql        #创建软连接
[root@whoami ~]# rpm -e --nodeps mariadb-libs         #卸载centos7上可能存在的数据库依赖关系

2.准备启动mysql的配置文件 [mysqld]服务端    [mysql]客户端
[root@whoami ~]#vim /etc/my.cnf        #创建配置文件,写入如下内容
[mysqld]
basedir=/opt/mysql
datadir=/opt/mysql/data
socket=/tmp/mysql.sock
server_id=1
port=3306
log_error=/opt/mysql/data/mysql_err.log

[mysql]
socket=/tmp/mysql.sock

3.初始化mysql服务端环境
[root@whoami ~]# rpm -e --nodeps mariadb-libs         #卸载centos7上可能存在的数据库依赖关系
[root@whoami ~]# yum install libaio-devel -y        #安装mysql的环境依赖
[root@whoami ~]# mkdir -p /opt/mysql/data/    #创建mysql数据文件夹,用于初始化数据
[root@whoami ~]# chown -R mysql.mysql /opt/mysql/        #修改mysql文件夹,所有的文件属主属组都是mysql,进行权限控制
[root@whoami ~]# /opt/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/opt/mysql/ --datadir=/opt/mysql/data/

4.配置mysql客户端,需要创建一个mysql启动脚本,通过mysqld.service去启动服务,使用systemctl命令管理mysql数据库
[root@whoami ~]# touch /etc/systemd/system/mysqld.service    #在启动目录中创建mysql启动脚本
[root@whoami ~]# cat /etc/systemd/system/mysqld.service     #写入如下内容,需要注意目录路径
Description=MySQL server by ylin
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/opt/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=5000
[root@whoami ~]# systemctl start mysqld.service     #启动服务,通过ss -ln 查看3306端口是否启动、ps -ef |grep mysqld进程是否启动,status判断进程是否启动正确,netstat -tunlp |grep 3306

5.登陆mysql数据库,需要配置环境变量
如果之前通过yum安装过其他数据库,可以通过yum remove直接进行卸载,不会影响到二进制安装的数据库
PATH="$PATH:/opt/mysql/bin:/opt/nginx-1.16.0/sbin"    #将mysql环境变量安装添加到/etc/profile中,需要删除之前添加的变量,进行合并
[root@whoami ~]# which mysql        #出现如下则表示配置成功
/opt/mysql/bin/mysql
登陆使用mysql
[root@whoami ~]# mysql -uroot -p        #默认没有密码直接回车进入
mysql> show databases;                    #查看数据表
mysql> use ylin                            #进入
Database changed
mysql> show tables;                        #查看表中信息
Empty set (0.00 sec)

mysql> 

[root@whoami ~]# mysqladmin -u root password 'love'        #修改密码

3、解析流程

cgi通用网关接口,用于http服务器(nginx、apache)和其他应用服务器(另一个动态服务器上安装的pyhon、PHP、PHP脚本编程语言编写的一个逻辑框架)通信的工具。
fastcgi是一个可伸缩,高效的在http服务器之间和后端程序之间通信的网关接口
在Linux环境下,fastcgi其实就是一个socket套接字文件

  • 如果http服务器和后端程序运行在两台服务器上,这个fastcgi通信的形式就是IP+端口的形式
  • 如果http服务器和后端程序运行在一台服务器上,那么这个socket可以是本地通信

当http服务器遇见静态请求,直接返回给用户;动态请求nginx就转发给fastcgi进程管理器和后端程序,后端程序进行逻辑处理完毕后,在返回给nginx,nginx在给用户响应。

4、PHP部署

1.安装环境依赖软件
[root@whoami ~]# yum install  gcc gcc-c++ make zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel libxslt-devel -y        #依赖环境检查
差一个软件yum中没有,手动编译安装(需要手动指定编译安装的目录)即可,下载地址如下
[root@whoami ~]# wget -P /mytools/  http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz #-P指定目录
./configure --prefix=/opt/libiconv    #编译环境配置
[root@whoami libiconv-1.15]# echo $?    #通过此命令可以查看上次命令是否执行成功,如果返回0则成功,127失败

2.编译安装PHP程序
[root@whoami mytools]# wget http://mirrors.sohu.com/php/php-7.3.5.tar.gz    #下载
#解压缩,进入目录开始编译参数配置安装,参数如下:
./configure --prefix=/opt/php7.3.5 \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-iconv-dir=/opt/libiconv \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--with-curl \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--with-gd \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-soap \
--enable-short-tags \
--enable-static \
--with-xsl \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--enable-ftp \
--enable-opcache=no

https://www.jianshu.com/p/564f35d4c7ce        #报错可以参考这个
https://blog.csdn.net/hankerbit/article/details/83834349        #还有这个