一篇文章教你了解和如何使用nginx

本文介绍了Nginx作为高性能HTTP服务器的功能、正反向代理的区别、Windows和Linux安装教程,强调了worker抢占机制和高效事件处理。还详细解读了nginx.conf配置及使用Nginx提供静态资源、跨域和防盗链支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是Nginx

Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供IMAP/POP3/SMTP服务 --引用百度百科

主要功能:反向代理,通过配置文件可以实现集群和负载均衡,静态资源虚拟化

2.正向代理与反向代理
2.1 正向代理

客户端请求目标服务器之间的一个代理服务器
请求会先经过代理服务器,然后在请求转发到目标服务器,获得内容后在返回给相应到客户端
举例:去网吧上网,网吧就是一个正向代理服务器,我们开机上网后访问的网站都是通过网吧的服务器,然后请求到目标服务器

2.2 反向代理

用户请求目标服务器,由代理服务器决定访问哪个ip
举例:去学校报到,提交报名表,由教务处决定分到哪个班级,教务处就相当于反向代理服务器

3.Nginx的安装
3.1 Window版本安装

windows版本比较简单,直接下载启动就好了

3.2 Linux版本安装

我这边linux版本是CentOS7版本
安装步骤:

  1. 安装Nginx
    去官网http://nginx.org/下载对应的nginx包,
    推荐使用稳定版本上传nginx到linux系统
    如:nginx-1.20的安装包下载 在这里插入图片描述

  2. 安装依赖环境
    (1)安装gcc环境
    yum install gcc-c++
    (2)安装PCRE库,用于解析正则表达式
    yum install -y pcre pcre-devel
    (3)zlib压缩和解压缩依赖,
    yum install -y zlib zlib-devel
    (4)SSL 安全的加密的套接字协议层,用于HTTP安全传输,也就是https
    yum install -y openssl openssl-devel
    3.解压,需要注意,解压后得到的是源码,源码需要编译后才能安装
    tar -zxvf nginx-1.16.1.tar.gz
    4.编译之前,先创建nginx临时目录,如果不创建,在启动nginx的过程中会报错
    mkdir /var/temp/nginx -p
    在nginx目录,输入如下命令进行配置,目的是为了创建makefile文件

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi  \
--with-http_ssl_module

注:\ 代表在命令行中换行,用于提高可读性配置命令:命令解释

命令解释
–prefix指定nginx安装目录
–pid-path指向nginx的pid
–lock-path锁定安装文件,防止被恶意篡改或误操作
–error-log错误日志
–http-log-pathhttp日志
–with-http_gzip_static_module启用gzip模块,在线实时压缩输出数据流
–http-client-body-temp-path设定客户端请求的临时目录
–http-proxy-temp-path设定http代理临时目录
–http-fastcgi-temp-path设定fastcgi临时目录
–http-uwsgi-temp-path设定uwsgi临时目录
–http-scgi-temp-path设定scgi临时目录

make编译
make
安装
make install
进入sbin目录启动
nginx./nginx
停止:
./nginx -s stop
重新加载:
./nginx -s reload
打开浏览器,访问虚拟机所处内网ip即可打开nginx默认页面,显示如下便表示安装成功:
注意事项:
1.如果在云服务器安装,需要开启默认的nginx端口:80
2.如果在虚拟机安装,需要关闭防火墙
3.本地win或mac需要关闭防火墙

查看防火墙状态
firewall-cmd --state
停止firewall
systemctl stop firewalld.service
禁止firewall开机启动
systemctl disable firewalld.service

4.Nginx的常用命令

./nginx -s stop 强制关闭,无论有没有客户在使用
./nginx -s quit 关闭,如果有客户在使用,等客户使用完在关闭
./nginx -t 校验配置文件
./nginx -v 查看版本号
./nginx -V 详细信息
./nginx -h 帮助文档
./nginx -c 指定特定的配置文件

5.Nginx进程模型解析

Nginx有两个进程:
一个是master进程,是Nginx的主进程,只有一个
一个是work进程,是Nginx的工作进程,可以有多个,可以在配置文件里面配置多个
Nginx进程之间的关系:
在这里插入图片描述
由master下发指令给worker,由worker去链接客户端处理,两者的管理类似于老板于员工之间的关系

6.Nginx处理web机制
6.1 Worker抢占机制

要了解worker抢占机制就要先明白一个名词‘惊群问题’

惊群问题是指在多线程(或多进程)场景下,有多个线程在等待某一资源可用,一旦这个资源可用,那么所有等待这个资源的线程都会被唤醒,但是资源只有一份,那么只有一个线程获得这个资源,其它线程都获取失败
惊群问题导致了不必要的线程唤醒,实际上只有一个线程能获取这份资源,那么理想情况下只唤醒一个线程就行了。而唤醒多个线程导致了不必要的线程调度,造成系统开销

而Nginx为了避免惊群问题,就有了accept_mutex这个锁,在Nginx默认下是开启的,当accept_mutex开启后,任意时刻只有一个进程能获得accept_mutex锁,获得accept_mutex锁的进程能监听web端口;无法获得accept_mutex锁的进程会把监听套接字从其epoll中删除
在这里插入图片描述

也就是锁master会fork出多个worker,当一个请求过来之后,多个worker会抢占的accept_mutex这个锁,只有有这个锁的worker才有资格处理这个请求

6.2 Nginx服务器事件处理

在Linux环境下用的是epoll模型,当一个请求进入到worker中如果他阻塞了,那么worker会去处理其他的请求,这样一个worker就可以‘同时’处理一百上千个请求。
在这里插入图片描述

6.3 同步与异步,阻塞与非阻塞

这四个概念两两组合,会形成4个新的概念,如下:

  1. 同步阻塞: 客户端发送请求给服务端,此时服务端处理任务时间很久,则客户端则被服务端堵塞了,所以客户端会一直等待服务端的响应,此时客户端不能做其他任何事,服务端也不会接受其他客户端的请求。这种通信机制比较简单粗暴,但是效率不高。
  2. 同步非阻塞: 客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候虽然客户端会一直等待响应,但是服务端可以处理其他的请求,过一会回来处理原先的。这种方式很高效,一个服务端可以处理很多请求,不会在因为任务没有处理完而堵着,所以这是非阻塞的。
  3. 异步阻塞(不存在,只是举个例子): 客户端发送请求给服务端,此时服务端处理任务时间很久,但是客户端不会等待服务器响应,它可以做其他的任务,等服务器处理完毕后再把结果响应给客户端,客户端得到回调后再处理服务端的响应。这种方式可以避免客户端一直处于等待的状态,优化了用户体验,其实就是类似于网页里发起的ajax异步请求。
  4. 异步非阻塞: 客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候的任务虽然处理时间会很久,但是客户端可以做其他的任务,因为他是异步的,可以在回调函数里处理响应;同时服务端是非阻塞的,所以服务端可以去处理其他的任务,如此,这个模式就显得非常的高效了。
    以上四点,除了第三点,其余的分别为BIO/NIO/AIO,面试官如果问你“请简述一下BIO/NIO/AIO之间的概念与区别”,那么你就可以组织一下语言来回答,或者通过如下生活实例来阐述也是可以的:
  5. BIO: 我去上厕所,这个时候坑位都满了,我必须等待坑位释放了,我才能上吧?!此时我啥都不干,站在厕所里盯着,过了一会有人出来了,我就赶紧蹲上去。
  6. NIO: 我去上厕所,这个时候坑位都满了,没关系,哥不急,我出去抽根烟,过会回来看看有没有空位,如果有我就蹲,如果没有我出去接着抽烟或者玩会手机。
  7. 异步阻塞: 我去上厕所,这个时候坑位都满了,没事我等着,等有了新的空位,让他通知我就行,通知了我,我就蹲上去。
  8. AIO: 我去上厕所,这个时候坑位都满了,没事,我一点也不急,我去厕所外面抽根烟再玩玩手机,等有新的坑位释放了,会有人通知我的,通知我了,我就可以进去蹲了。
    从这个生活实例中能可以看得出来:
    同步就是我需要自己每隔一段时间,以轮训的方式去看看有没有空的坑位;
    异步则是有人拉完茅坑会通知你,通知你后你再回去蹲;阻塞就是在等待的过程中,你不去做其他任何事情,干等着;非阻塞就是你再等待的过程中可以去做其他的事,比如抽烟、喝酒、烫头、玩手机。
    小结:异步的优势显而易见,大大优化用户体验,非阻塞使得系统资源开销远远小于阻塞模式,因为系统不需要创建新的进程(或线程),大大地节省了系统的资源,如此多出来的系统资源可以给其他的中间件去服务了。
7.nginx.conf配置文件详解
7.1 nginx.conf结构

在这里插入图片描述

7.2 nginx.conf 核心配置文件说明

设置worker进程的用户,指的linux中的用户,会涉及到nginx操作目录或文件的一些权限,默认为nobody
user root;
worker进程工作数设置,一般来说CPU有几个,就设置几个,或者设置为N-1也行
worker_processes 1;
nginx 日志级别debug | info | notice | warn | error | crit | alert | emerg,错误级别从左到右越来越大
设置nginx进程
pidpid logs/nginx.pid;
设置工作模式

events {
    # 默认使用epoll
    use epoll;
    # 每个worker允许连接的客户端最大连接数
    worker_connections  10240;
}

http 是指令块,针对http网络传输的一些指令配置

http {
}

include 引入外部配置,提高可读性,避免单个配置文件过大
include mime.types;
设定日志格式,main为定义的格式名称,如此 access_log 就可以直接使用这个变量了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ufp2OnC5-1586509226566)(en-resource://database/1286:1)]

参数名参数意义
$remote_addr客户端ip
$remote_user远程客户端用户名,一般为:’-’
$time_local时间和时区
$request请求的url以及method
$status响应状态码
$body_bytes_send响应客户端内容字节数
$http_referer记录用户从哪个链接跳转过来的
$http_user_agent用户所使用的代理,一般来时都是浏览器
$http_x_forwarded_for通过代理服务器来记录客户端的ip

sendfile使用高效文件传输,提升传输性能。启用后才能使用tcp_nopush,是指当数据表累积一定大小后才发送,提高了效率。

sendfile        on;
tcp_nopush      on;

keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。

#keepalive_timeout  0;
keepalive_timeout  65;

gzip启用压缩,html/js/css压缩后传输会更快
gzip on;
server可以在http指令块中设置多个虚拟主机

  • listen 监听端口
  • server_name localhost、ip、域名
  • location 请求路由映射,匹配拦截
  • root 请求位置
  • index 首页设置
server {
            listen       88;
            server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
}
8.使用Nginx为静态资源提供服务
8.1 静态网页的配置
server {
        # 访问的端口
        listen       90;
        # 访问的路径
        server_name  localhost;
        # 路由的配置
        location / {
            # 资源的存放路径
            root   /home/software/foodie-shop;
            # 默认打开界面
            index  index.html index.htm;
        }
    }
8.2 静态资源的配置
server {
        # 访问的端口
        listen       90;
        # 访问的路径
        server_name  localhost;
        # 路由的配置
       location /test {
            root    /home;
        }
    }

文件存放路径
在这里插入图片描述
网站访问路径
在这里插入图片描述

8.3 location的匹配规则解析
#正则表达式。*代表不区分大小写
location ~* \.(GIF|png|bmp|jpg|jpeg){
root /home;
}

#精确匹配
location = /{
root /home;
}

#正则匹配
~代表使用正则匹配,*代表不区分大小写
location ~
.(gif|JPG|png|jpeg|bmp){
root /home;
}

#^~ 以某个字符路径开头请求
location ^~ /imooc/img{
root /home;
}

#默认匹配规则
location / {
root /home;
}

8.4 Nginx 跨域配置支持

#允许跨域请求的域,*代表所有 
add_header 'Access-Control-Allow-Origin' *; 
#允许带上cookie请求 
add_header 'Access-Control-Allow-Credentials' 'true'; 
#允许请求的方法,比如 GET/POST/PUT/DELETE 
add_header 'Access-Control-Allow-Methods' *; 
#允许请求的header 
add_header 'Access-Control-Allow-Headers' *;

8.5 Nginx 防盗链配置

#对源站点验证 
valid_referers *.silusoft.com;
#非法引入会进入下方判断
if ($invalid_referer) { return 404; }

注:本篇文章一些图片来自于网络

原文出处链接:https://blog.youkuaiyun.com/qq_38446413/article/details/105437579
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值