Nginx网站服务——编译安装,基于授权和客户端访问控制

186 阅读11分钟

Nginx服务基础

Nginx:

一款高性能、轻量级web服务软件

  • 稳定性高
  • 系统资源消耗低
  • 对HTTP并发连接的处理能力高
  • 单台物理服务器可支持30000-50000个并发请求

什么是Nginx:

Nginx是一个轻量级/高性能的反向代理web服务器,用于HTTP、HTTPS、SMTP、POP3和IMAP协议,它实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用Nignx网站用户很多;例如:新浪、网易、腾讯

Nginx有哪些特点:

跨平台、配置简单

非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发

内存消耗小:开启10个Nginx才占150M内存

成本低廉、且开源

稳定性高,宕机的概率非常小

内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,在发送的请求就不会发送到宕机的服务器,重新将请求提交到其他的节点上

Nginx应用场景:

http服务器,Nginx是一个http服务可以独立提供http服务,可以做网页静态服务器

虚拟主机,可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机

反向代理,负载均衡,在网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理,并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况

web前端缓存

nginx中也可以配置安全管理,比如可以使用nginx搭建API接口网关,对每个接口服务进行栏载

Nginx和Apache的区别

轻量级,nginx比Apache占用更少的内存及资源

静态处理,Nginx静态处理性能比Apache高

Nginx可以实现无缓存的反向代理加速,提高网站运行速度

Nginx的性能和可伸缩性不依赖硬件,Apache依赖于硬件

Nginx支持热部署,启动速度迅速,可以在不间断服务的情况下,对软件版本或者配置进行升级

Nginx异步非阻塞,Apache同步阻塞

Nginx是异步进程,多个连接可以对应一个进程,Apache是同步多进程,一个连接对应一个进程

Nginx高度模块化,编写模块相对简单且组件比Apache少

高并发下Nginx能保持低资源低消耗高性能

Nginx配置简单,Apache配置复杂

Nginx是基于事件的web服务器,Apache是基于流程的web服务器

扩展:

什么是CDN

CDN的全称是(Content Delivery Network),即内容分发网络,其目的是通过在现有的Internet中增加一层新的CACHE(缓存)层,将网站的内容发布到最接近用户的网络“边缘”的节点,使用户可以就近取所需的内容,提高用户访问网站的响应速度。

从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因,提高用户访问网站的响应速度

CDN的工作原理:将你的源站资源缓存到位于全球各地的CDN的节点上,用户请求资源时,就近返回节点上缓存的资源,而不需要每个用户的请求都回你的源站获取,避免网络拥塞、缓解源站压力,保证用户访问资源的速度和体验

CDN.jpg

编译安装Nginx服务

1.关闭防火墙,将安装nginx所需软件传到/opt目录下

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
 
# 将压缩包传入到/opt目录下
nginx-1.18.0.tar.gz

Snipaste_2022-09-27_16-21-32.png

2.安装依赖包

nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些安装的开发包,以便提供相应的库和头文件

yum install -y pcre-devel zlib-devel gcc gcc-c++ make
​
#各程序作用解释如下
gcc      #C语言的编译器
gcc-c++  #c++的编译器
make     #源代码编译器(源代码转换成二进制文件)
pcre-devel  #perl的接口开发包,提供正则表达式
zlib-decel  #提供压缩功能
Snipaste_2022-09-27_16-22-25.png

3.创建运行用户、组(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)

useradd -M -s /sbin/nologin nginx
Snipaste_2022-09-27_16-24-50.png

4.编译安装Nginx

cd /opt
tar zxvf nginx-1.18.0.tar.gz
##切换到源码目录下,运行configure脚本 指定安装路径和安装模块 
./configure \
> --prefix=/usr/local/nginx \       #指定nginx的安装路径
> --user=nginx \                     #指定用户名
> --group=nginx \                    #指定组名
> --with-http_stub_status_module     #启用 http_stub_status_module模块以变持状态线计
 
make -j 2&& make install
 
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/          ##让系统识别nginx的操作命令
Snipaste_2022-09-27_16-27-53.png Snipaste_2022-09-27_16-28-57.png Snipaste_2022-09-27_16-32-05.png

5.检查、启动、重启、停止nginx服务

多种方式查看nginx的PID号

nginx有两个进程:主进程Master Process,工作进程work_Process

cat /usr/local/nginx/logs/nginx.pid  #查看nginx主进程的PID号
pgrep nginx -l  ##查看nginx的主进程号或工作进程号
lsof -i :80     ##查看nginx的主进程和工作进程号
ss -natp | grep nginx  ##查看nginx的主进程号和工作进程号
netstat -natp | grep nginx  #查看nginx主进程的PID号

启动nginx服务

nginx -t  #检查配置文件是否配置 正确
#启动
nginx
Snipaste_2022-09-27_16-33-37.png

停止nginx服务

#停止
cat /usr/local/nginx/logs/nginx.pid  #先查看nginx主进程的PID号
kill -3 <PID号>     #kill -3 杀死进程时可以记录事故现场的信息
kill -s QUIT <PID号>                 
killall -3 nginx
killall -s QUIT nginx
Snipaste_2022-09-27_16-36-07.png

扩展:

kill默认传15代表的信号为SIGTERM,意思是:进程需要关闭,请自行停止运行并退出,进程可以清理缓存自行结束,也可以拒绝结束

kill -3 在kilI基础上可以打印进程各个线程的堆栈信息,保存路径为:/proc/${pid}/cwd 文件名为antBuilderOutput.log,kill -3 保存事故现场信息然后退出

重载nginx服务

#重载
kill -1 <PID号>   ##重载nginx服务
kill -s HUP <PID号>
killall -1 nginx
killall -s HUP nginx

Snipaste_2022-09-27_16-39-25.png

日志分割(移走原有日志,重新打开日志文件)

cd /usr/local/nginx/logs   //切换到日志目录
#日志分割,重新打开日志文件
kill -USR1 <PID号>
Snipaste_2022-09-27_16-43-03.png

升级nginx服务

#平滑升级:
kill -USR2 <PID号>
​
新版本升级:
tar -zxvf nginx-1.xx.xX. tar.gz
cd nginx-1.xx. xx
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module 
​
#重新编译: 
make
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old
cp /opt/nginx-1.xx.xx/objs/nginx /usr/local/nginx/sbin/nginx
make upgrade ##要进入/opt/nginx-1.xx.xx目录下在操作
##要保证当前nginx进程是通过/usr/local/nginx/sbin/nginx启动的,而不是通过查找环境变量中那个nginx命令启动的
#或者先 killall nginx ,再/usr/local/nginx/sbin/nginx

6.添加nginx系统服务 服务管理脚本

方法一:

vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 2345 20 90
#description:Nginx Service Control Script
COM="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
  $COM
;;
​
stop)
   kill -s QUIT $(cat $PID)
;;
​
restart)
   $0 stop
   $0 start
;;
​
reload)
   kill -s HUP $(cat $PID)
;;
​
*)
echo "Usage:$0 {start|stop|restart|reload}"
exit 1
 
esac
exit 0
Snipaste_2022-09-27_17-13-05.png
chmod +x /etc/init.d/nginx  #给nginx脚本添加权限
chkconfig --add nginx        #将nginx加入chkconfig
systemctl daemon-reload          #磁盘上的ngin服务更改,运行'systemctl daemon-reload'重新加载单元。
systemctl start nginx
systemctl stop nginx
Snipaste_2022-09-27_17-14-53.png

方法二:

vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP SMAINPID
ExecrStop=/bin/kill-s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl start nginx
systemctl stop nginx

文件内容解释

[Unit]∶服务的说明 
Description∶ 描述服务 
After∶依赖, 当依赖的服务启动之后再启动自定义的服务
​
[Service]:服务运行参数的设置
Type=forking:是后台运行的形式,使用此启动类型应同时指定
PIDFile=,以便systemd能够跟踪服务的主进程。
ExecStart:服务的具体运行命令 
ExecReload:重启命令 
ExecStop:停止命令
PrivateTmp=True表示给服务分配独立的临时空间 注意∶ 启动、重启、停止命令全部要求使用绝对路径
​
[Install]服务安装的相关设置,可设置为多用户

7.浏览器访问验证

默认首页文件在/usr/local/nginx/html目录下

Snipaste_2022-09-27_17-20-52.png Snipaste_2022-09-27_17-20-22.png

认识Nginx服务的主配置文件

主配置文件位置

/usr/local/nginx/conf

目录下:

nginx.conf是主配置文件

nginx.conf.default是主配置文件的备份文件

扩展:

cat nginx.conf | egrep -v "^$|^\s*#" ##将空行和注释行都去掉

\s : 空格 * :0或者1个或者多个

主配置文件中有六个主要模块

1.全局块:全局配置,对全局生效

2.events块:配置影响Nginx服务器与用户的网络连接

3.http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置

4.server块:配置虚拟主机的相关参数,一个httpd块中可以有多个server块;

5.location块:用于配置匹配的url,一个server块中可以有多个location块

6、upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分

1.全局配置

就是配置文件从头开始到 events 块之间的内容,主要设置的是影响nginx服务器整体运行的配置指令。比如 worker_process,值越大,可以支持的并发处理量也越多,但是还是和服务器的硬件相关

vim /usr/local/nginx/conf/nginx.conf
#user  nobody;                          #运行用户,若编译时未指定则默认为nobody,若编译指定了用户则会写到二进制程序里变成默认配置。此前编译时指定了"--user=nginx",所以现在二进制程序中的运行用户为nginx
worker_processes  1;                    #工作进程数量,一般设置为和CPU核数一样
#error_log  logs/error.log;             #错误日志文件的位置
#pid        logs/nginx.pid;             #PID 文件的位置
Snipaste_2022-09-27_17-25-07.png

2.ecents块(I/O事件配置)

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等

events {
    use epoll;                          #使用epoll I/O模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
    worker_connections  1024;           #每个工作进程处理1024个连接
}
​
如提高每个进程的连接数还需执行"ulimit -n 65535"命令临时修改本地每个进程可以同时打开的最大文件数。
在Linux平台上, 在进行高并发TCP连接处理时, 最高的并发数量都要受到系统对用户 单—一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制
​
epoll是Linux内核为处理大批句柄(连接数)而改进的poll,是Linux下多路复用To接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
Snipaste_2022-09-27_17-34-30.png

2.1查看Nginx支持 的最大并发量(软件支持、系统支持、CPU性能)

例如:现有CPU有两核,想要实现支持30000并发量

2.1.1.软件支持

软件配置支持多少并发量,由主配置文件nginx.conf决定:理论上支持的并发量=工作进程数量*每个工作进程处理的连接数

将工作进程数设置为2(与CPU核数一致),每个工作进程处理15000个连接(一般设置为2的次方),那么软件支持的最大并发数量是30000个

Snipaste_2022-09-27_18-08-22.png

2.1.2.系统支持

系统会限制本地每个用户进程可以同时打开的最大文件数量,即系统会限制每个进程的连接数

查看系统支持多少并发量:

ulimit -a 可查看系统允许当前用户进程打开的文件数限制

Snipaste_2022-09-27_18-13-05.png

修改系统支持的最大并发量

ulimit -n 65535 可临时修改本地每个用户进程可以同时打开的最大文件数
vim /etc/security/limits.conf,编辑该文件可永久修改
Snipaste_2022-09-27_18-18-51.png

注意:完成配置后 xshell想要查看系统并发量需要断开重新连接

3.HTTP配置

http块:包括http全局块,以及多个server块

http全局块:配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等

server块:这块和虚拟机有密切关系,虚拟机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本,每个http块可以包括多个server块,而每个server块就相当于一台虚拟主机

而每个server块也分为全局server块,以及可以同时包含多个location块

http {
    include       mime.types;                                           ##文件扩展名与文件类型映射表
    default_type  application/octet-stream;                              ##默认文件类型
                                                                           ##日志格式设定
    #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;    #日志格式设定
     
    sendfile        on;     ##支持文件发送(下载)
    ##此选项允许或禁止使用socket的TCP cORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
    #tcp_nopush     on; #减少网络报文段的数量
    ##连接保持超时时间,单位是秒
    #keepalive_timeout  0;
    keepalive_timeout  65;
     
    #gzip  on;                 ##gzip模块设置,设置是否开启gzip压缩输出
    ##web服务的监听配置     
    server {
     listen 80;            ##监听地址及端口
     server_name  www.clj.com;        ##站点域名,可以有多个,用空格隔开
     #charset utf-8;        #网页的默认字符集
     #access_log  logs/host.access.log  main;       
           location / {      ##根目录配置
            root   html;      ##网站根目录的位置/usr/local/nginx/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;
        }

查看nginx支持的文件类型

Snipaste_2022-09-27_18-29-43.png

3.1全局server块

最常见的配置是本虚拟机主机的监听配置,和本虚拟机的名称和IP的地址

listen       80;    ##监听地址和端口
server_name  localhost;  ##站点域名可以有多个用空格隔开

3.2 location块

一个 server 块可以配置多个 location 块。

主要作用是根据请求地址路径的匹配,匹配成功进行特定的处理。

这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行

location常见配置命令:root、alias、proxy_pass

root(根路径配置):root /var/www/html

请求www.yuji.com/test/1.html,会返回文件/var/www/html/test/1.html

alias(别名配置,即虚拟路径):alias /var/www/html

请求www.yuji.com/test/1.html,会返回文件/var/www/html/1.html

proxy_pass(反向代理配置)

根路径和虚拟路径

示例1

location  / {
   root html;  ##表示此时根目录为/usr/local/nginx/html/
   index index.html index.htm;
}
​
#此时访问路径和返回文件的关系为:
http://192.168.46.40/index.html  --->  /usr/local/nginx/html/index.html
http://192.168.46.40/test/index.html  ---> /usr/local/nginx/html/test/index.html

示例2

location  /test {
   alias /usr/local/nginx/html;  ##表示此时根目录为/usr/local/nginx/html/
   index index.html index.htm;
}
​
#此时访问路径和返回文件的关系为:
http://192.168.46.40/test/index.html  ---> /html/test/index.html

访问状态统计配置

1.查看nginx的安装模块,是否包含HTTP_STUB_STATUS模块

/usr/local/nginx/ sbin/nginx -V #查看已安装的nginx是否包含HTTP_STUB_STATUS模块
nginx -v  ##查看nginx版本,此前已将nginx的可执行文件放入PATH的目录中,所以可以直接使用nginx命令
nginx -V  ##查看nginx的版本和编译安装时的参数

Snipaste_2022-09-28_15-55-04.png

cat /opt/nginx-1.22.0/auto/options ##查看nginx已安装和未安装的模块,with表示已安装,without表示未安装
cat /opt/nginx-1.22.0/auto/options | grep "YES" ##查看nginx已安装的模块

Snipaste_2022-09-28_15-57-57.png

查看HTTP_STUB_STATUS模块是否安装

cat /opt/nginx-1.22.0/auto/options | grep "HTTP_STUB_STATUS"

Snipaste_2022-09-28_15-59-52.png

2.修改nginx.conf配置文件,指定访问位置并添加stub_status 配置

cd /usr/local/nginx/conf
cp nginx.conf nginx.conf.bak  ##先备份原配置文件
vim /usr/local/nginx/conf/nginx.conf ##编辑
......
http {
......
    server {
        listen 80;
        server_name www.benet.com;
        charset utf-8;
        location / {
            root html;
            index index.html index.php;
        }
        ##添加 stub_status 配置##
        location /status {                  #访问位置为/status
            stub_status on;                 #打开状态统计功能
            access_log off;                 #关闭此位置的日志记录
        }
    }
}

Snipaste_2022-09-28_16-06-24.png

3.重启服务,访问测试

nginx -t
systemctl restart nginx

Snipaste_2022-09-28_16-09-17.png

通过命令进行访问

curl -Ls http://192.168.46.40/status ##查看TCP连接数和访问状态
Active connections: 1
server accepts handled requests
  3 3 10
Reading: 0 Writing: 1 Waiting: 0#Active connections:表示当前活动的连接数。
#server accepts handled requests:表示当前已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP握手次数、已处理的请求数。
#ReadingNginx 读取到客户端的Header信息数。
#WritingNginx 返回给客户端的Header信息数。
#Waiting: 开启keep-alive的情况下,这个值等于 active – (reading + writing),意思就是Nginx已经处理完成,正在等候下一次请求指令的驻留连接。

Snipaste_2022-09-28_16-10-48.png

监控nginx当前并发数量

可使用cur -Ls http://192.168.46.40/status与awk和if语句进行性能监控
​
#!/bin/bash
while true
do
  COM=$(cur -Ls http://192.168.46.40/status | awk '/Active     connections:/{print $3}')
  if [ $COM -gt 20000];then
    echo "警告!当前并发数量为$COM,超过预警值!"
  fi
  sleep 2
done

基于授权的访问控制

设置只有指定用户才可以访问该网页,想要对哪个路径进行限制,就在location下添加路径和认证配置。

1.生成用户密码认证文件

yum install -y  httpd-tools
htpasswd -c /usr/local/nginx/passwd.db nancy   ##文件名自拟。-c表示生成passwd.db文件,如果该文件已存在,则不需要加-c
chown nginx /usr/local/nginx/passwd.db  ##文件属主必须修改为nginx,否则会报错
chmod 400 /usr/local/nginx/passwd.db   ##文件权限必须设置为400

Snipaste_2022-09-28_16-16-55.png

2.修改主配置文件相对应目录,添加认证配置项

vim /usr/local/nginx/conf/nginx.conf
......
    server {
        location / {
            root   html;
            index  index.html index.htm;
            ##添加认证配置##
            auth_basic "secret";                #设置密码提示框文字信息
            auth_basic_user_file /usr/local/nginx/passwd.db;##指定密码验证文件
        }
    }

Snipaste_2022-09-28_16-33-37.png

3.重启服务,访问测试

nginx -t  ##检查配置文件是否有误
systemctl restart nginx 

Snipaste_2022-09-28_16-36-23.png

Snipaste_2022-09-28_16-36-54.png

基于客户端的访问控制

设置只有指定IP/IP段才可以访问该网页,或指定IP/IP段不能访问,想要对哪个路径进行限制,就在location块下添加路径和控制规则

访问控制规则如下:

deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。 allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。 规则从上往下执行,如匹配则停止,不再往下匹配。

示例:

注意先关闭web服务器的防护墙

vim /usr/local/nginx/conf/nginx.conf
......
    server {
        location / {
            ......
            ##添加控制规则##
            allow 192.168.46.40;        #允许访问的客户端 IP
            deny all;                   #拒绝其它IP客户端访问
        }
    }
​
systemctl restart nginx
Snipaste_2022-09-28_16-38-49.png Snipaste_2022-09-28_16-41-00.png Snipaste_2022-09-28_16-41-16.png