如何快速搭建nginx服务

server/2024/11/15 8:33:21/
http://www.w3.org/2000/svg" style="display: none;">webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

华子目录

  • nginx简介
  • nginx正向代理功能
  • nginx反向代理功能
    • nginx反向代理的工作流程
    • 代理本质
  • nginx负载均衡
  • 部署nginx
  • 常用命令
    • systemctl系列
    • nginx自带命令
  • nginx配置文件
    • 主配置文件`/etc/nginx/nginx.conf`
      • 内容结构
      • 模块分析
      • 配置分析
      • 注意
        • 示例
      • nginx.conf配置文件的语法规则
  • 实验1:快速搭建网站
  • 实验2:替换网页目录
  • 实验3:搭建location板块的网站
  • 实验4:搭建带有密码验证访问的网站数据列表

nginx_1">nginx简介

概念

  • nginx是一款轻量级http服务器,也是一款邮箱代理服务器,同时具备反向代理通用tcp/udp代理的功能
  • nginx可以运行在x86、ARM等多种平台上,同时支持Linux,Windows等主流的操作系统

特点

  • 支持高并发
    • 单机nginx可支持十万级的并发连接,经过优化后可最高支持百万级并发连接
  • 内存资源消耗低
    • 同级web服务器中,nginx占用的内存最少一万非活跃的http keep-alive连接仅消耗2.5M内存
  • 高扩展性
    • apache一样,nginx采用模块化设计,并支持非常丰富的第三方模块
  • 高可靠性
    • nginx采用master-worker模式,如果worker出现故障,master可以快速开启一个新的worker来提供服务

nginx_16">nginx框架

  • 主进程:master

    • 检查nginx配置是否正确
    • 创建、监控worker进程的数量和状态
    • 接收对nginx的管理指令,并作出对应操作
  • 工作进程:worker

    • 处理客户端请求
    • 接收master发来的指令,并做对应操作
  • https://img-blog.csdnimg.cn/direct/c8699f78843a469792d8a704f597a7e4.png" alt="在这里插入图片描述" />

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

nginx_29">nginx关键工作机制

  • 抢占机制:当客户端发起请求时,会激活accept_mutex互斥锁,哪个worker抢占了该互斥锁,该客户端的请求就由哪个worker响应和处理
  • https://img-blog.csdnimg.cn/direct/31f950c667ae498995f0d37f3aeb1b70.png" alt="在这里插入图片描述" />
  • 异步非阻塞模式:在传统事件处理模式下,如果所有的worker被客户端阻塞后,新来的客户就需要等待,直到原来的客户端释放worker后才能被处理请求。在异步非阻塞模式下,底层使用了linux的epol模型,就算worker被阻塞,新的客户端请求也会被正常处理
  • https://img-blog.csdnimg.cn/direct/571740f4ad0b4f619c5252e1dfa0a054.png" alt="在这里插入图片描述" />

nginx_35">nginx正向代理功能

  • 图:

  • https://img-blog.csdnimg.cn/direct/7cc407e7dd704de1b9a1bfec99bcb4e2.png" alt="在这里插入图片描述" />

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

  • 理解:

    • https://img-blog.csdnimg.cn/direct/43c5b16c60374a38921cd7079ca51592.png" alt="在这里插入图片描述" />
    • A租房人(客户端)想租C真实房东的房子,但不认识C真实房东(服务端)
    • B房产中介(代理)认识C真实房东(服务端),并且从C真实房东(服务端)租到了房
    • A租房人(客户端)通过B房产中介(代理)租到了C真实房东(服务端)的房
    • C真实房东(服务端)只知道房子租给了B房产中介(代理),并不知道A租房人(客户端)租了自己的房子
  • 结论:正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端代理发送一个请求并指定目标(原始服务器),然后代理原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理就像要访问googleypn代理翻墙去访问(用户知道要访问真正的服务器)

nginx_48">nginx反向代理功能

  • 图:
  • https://img-blog.csdnimg.cn/direct/92107808555c4cdc806d331cff797ac9.png" alt="在这里插入图片描述" />
  • 分析:反向代理正好相反,它也是在客户端和服务器端的一个代理服务器,但是这个代理服务器的目的是用来保护服务器端的,当外网客户端来访问我们的服务器为了避免暴露应用服务器实际ip地址,我们会让客端访问代理服务器,然后代理服务器再根据客户端的请求去实际的应用服务器获取响应内容并返回客户端

nginx_53">nginx反向代理的工作流程

  • 1.客户端向Nginx发送请求
  • 2.Nginx在收到客户端发送的请求后,将请求转发到后端务器
  • 3.后端服务器将客户端请求的资源回复给Nginx
  • 4.Nginx将资源返回给客户端

代理本质

  • Nginx反向代理通过位于location中的proxy_pass实现
  • 在反向代理的工作流程中,客户端向代理请求资源时使用的端口可以和服务器提供服务的端口不一致
  • https://img-blog.csdnimg.cn/direct/3a39533a531f45f0b51110e58c5ea876.png" alt="在这里插入图片描述" />

nginx_64">nginx负载均衡

  • Nginx可以提供四层七层的负载均衡
  • Nginx的负载均衡功能通过位于http中的upstream实现
  • Nginx提供了多种负载均衡算法,如轮询、权重等
  • 轮询算法下,Nginx会轮流将请求发送给不同的服务器,使每个服务器都均等的提供服务
  • 权重算法下,Nginx会按照配置的权重比例,将请求发送给服务器性能较好的服务器将提供更多的服务,性能较少的服务器将提供较少的服务
  • https://img-blog.csdnimg.cn/direct/144a0dbc5c2d4287b9ac53710f63439a.png" alt="在这里插入图片描述" />

nginx_72">部署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  #查看nginx版本,编译器,配置参数等信息
nginx version: nginx/1.20.1[root@server ~]# systemctl start nginx[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[root@server ~]# ps -ef | grep nginx   # 查看nginx进程
root       32436       1  0 13:49 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx      32437   32436  0 13:49 ?        00:00:00 nginx: worker process
nginx      32438   32436  0 13:49 ?        00:00:00 nginx: worker process
root       32465    2807  0 13:49 pts/0    00:00:00 grep --color=auto nginx[root@server ~]# netstat -lntup | grep nginx  #查看nginx端口
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      32436/nginx: master
tcp6       0      0 :::80                   :::*                    LISTEN      32436/nginx: master

常用命令

systemctl系列

[root@server ~]# systemctl start nginx #启动服务[root@server ~]# systemctl restart nginx #重启服务[root@server ~]# systemctl enable nginx #开机启动[root@server ~]# systemctl stop nginx #停止服务[root@server ~]# systemctl disable nginx #取消开机启动[root@server ~]# systemctl status nginx #查看状态

nginx_119">nginx自带命令

[root@server ~]# nginx   #启动nginx[root@server ~]# nginx restart  #重启服务[root@server ~]# nginx -s reload  #重新加载配置文件[root@server ~]# nginx -s stop  #强行停止服务[root@server ~]# nginx -s quit  #优雅停止服务,即所有请求处理完后退出服务[root@server ~]# nginx -v  #查看版本号[root@server ~]# nginx -t  #检查配置文件的语法是否错误,无错返回ok

nginx_136">nginx配置文件

[root@server ~]# cd /etc/nginx  #服务目录[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 编码(俄语)转换的映射文件
网页默认目录:/usr/share/nginx/html
访问日志:/var/log/nginx/access.log
错误日志:/var/log/nginx/error.log

nginxnginxconf_167">主配置文件/etc/nginx/nginx.conf

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

内容结构

  • 全局配置

    • 运行用户
    • worker数量
    • 日志参数
    • include导入的外部配置文件
  • 性能配置

    • 工作模式
    • TCP连接数
  • http模块配置

    • http请求和响应的参数
    • 路由配置
    • 虚拟主机配置
    • 反向代理配置
    • 负载均衡配置

https://img-blog.csdnimg.cn/direct/e2e66c9141c74fb1bf5137a06eb0d8d1.png" alt="在这里插入图片描述" />

模块分析

  • 层级结构图
  • https://img-blog.csdnimg.cn/direct/cfb0569534cf41279a56516a4000f6aa.png" alt="在这里插入图片描述" />

配置分析

# 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; #使用epo11事件驱动模型,但不推荐配置它,让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; #子配置文件存储路径#1ocation配置段,一般用来匹配不同的URI请求location / {root    /usr/share/nginx/html;  #相对路径网站根目录alias   /usr/share/nginx/html/; #绝对路径网站根目录index index.html index.htm; #默认首页文件deny 172.168.22.11;  #禁止访问的ip地址,可以为a11allow 172.168.33.44;  #允许访问的ip地址,可以为a11autoindex on;  #开启目录文件列表autoindex_exact_size on; #显示出文件的确切大小,单位是bytesautoindex_localtime on; #显示的文件时间为文件的服务器时间charset utf-8,gbk; #避免中文乱码auth_basic "xxxx";  #加密网页验证时的提示信息auth_basic_user_file   /路径/文件名; #加密网页使用的密码验证文件}error_page 404 /404.html;  #404时返回给客户端的页面location = /404.html {}error_page 500 502 503 504 /50x.html; #50x错误返回给客户端的页面location = /50x.html {}}#https虚拟主机定义
# Settings for a TLS enabled server.
#
#    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 http://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 {......
}
  • 匹配规则:
    • = 精确匹配
    • ~ 正则匹配,区分大小写
    • ~* 正则匹配,不区分大小写
    • ^~ 匹配以某个字符串开头,不是正则匹配
    • / 通用匹配,如果其他location都没有匹配,则该location会进行匹配
  • 匹配优先级:= ^~ ~ ~* 不带任何字符
示例
server {listen  80;server_name  www.nginx-test.com;#只用当访问www.nginx-test.com/match_all/ 时才会匹配到 /usr/share/nginx/html/match_all/index.htmllocation = /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.htmllocation ^~ /bbs/ {root  /usr/share/nginx/html;index index.html index.htm;}#注意:上述location都找不到的话都在这里找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文件

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

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

实验1:快速搭建网站

[root@server ~]# yum install nginx -y[root@server ~]# systemctl start nginx[root@server ~]# echo "welcome to www.openlab.com" > /usr/share/nginx/html/index.html  #写入网页数据#使用windows端进入访问

https://img-blog.csdnimg.cn/direct/a25eaf0b5a7d45b29d5c0959fc853c9d.png" alt="在这里插入图片描述" />

实验2:替换网页目录

[root@server ~]# yum install nginx -y[root@server ~]# systemctl start nginx[root@server ~]# mkdir -p /www/sxhkt  #创建网页目录#使用mobaxterm上传网页数据到/www/sxhkt中[root@server ~]# cd /www/sxhkt[root@server sxhkt]# ls
CSS  img  index.html  js[root@server sxhkt]# vim /etc/nginx/nginx.conf
#定位到42行,修改如下:
root    /www/sxhkt;[root@server sxhkt]# systemctl restart nginx#测试:打开Windows端输入IP地址

https://img-blog.csdnimg.cn/direct/abe90eb959a24f7aa0810f40cf171ba5.png" alt="在这里插入图片描述" />

实验3:搭建location板块的网站

[root@server ~]# yum install nginx -y[root@server ~]# systemctl start nginx[root@server ~]# mkdir -p /www/sxhkt  #创建网页目录#使用mobaxterm上传网页数据到/www/sxhkt中[root@server ~]# cd /www/sxhkt[root@server sxhkt]# ls
CSS  img  index.html  js[root@server sxhkt]# vim /etc/nginx/nginx.conf
#server板块中添加location板块
server{listen    80;listen    [::]:80;server_name  _;location / {root   /www/sxhkt;index index.html index.htm;}
}[root@server sxhkt]# systemctl restart nginx#测试:打开Windows端输入IP地址

https://img-blog.csdnimg.cn/direct/05add5cb5bba4c3ba7f38fb7b36cb097.png" alt="在这里插入图片描述" />

实验4:搭建带有密码验证访问的网站数据列表

  • 准备工作
[root@server ~]# setenforce 0[root@server ~]# systemctl stop firewalld[root@server ~]# systemctl disable firewalld[root@server ~]# yum install nginx -y[root@server ~]# yum install httpd-tools -y  [root@server ~]# systemctl start nginx[root@server ~]# systemctl enable nginx
  • 新建账户
[root@server ~]# useradd test1
[root@server ~]# useradd test2
[root@server ~]# passwd test1
更改用户 test1 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
[root@server ~]# passwd test2
更改用户 test2 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
重新输入新的密码:
passwd:所有的身份验证令牌已经成功更新。
  • 增加密码访问控制htpasswd
[root@server ~]# htpasswd -c /etc/nginx/passwd test1
New password:           #密码:12345
Re-type new password:   
Adding password for user test1[root@server ~]# htpasswd /etc/nginx/passwd test2
New password:        #密码:12345
Re-type new password:
Adding password for user test2# htpasswd:生成密码数据的命令
# -c:表示第一次生成,会创建存储密码的文件,第二次创建密码时不能增加-c参数,否则会覆盖
# /etc/httpd/passwd:存储访问网站的密码文件,passwd为文件名,名称可以自定义
# test1:需要验证密码访问的账户名称
  • 开启访问网站时需要验证密码
[root@server ~]# vim /etc/nginx/nginx.conf
server {listen       80;listen       [::]:80;server_name  _;root         /var/log;   #数据列表autoindex     on;    #开启访问网站时需要验证密码auth_basic    "请输入密码";  #提示语auth_basic_user_file    /etc/nginx/passwd;   #对比的密码文件库
  • 重启服务,测试
[root@server ~]# systemctl restart nginx#windows打开浏览器输入IP地址,进行测试

https://img-blog.csdnimg.cn/direct/b6b9793d249b4658abc0e8130e94f8b4.png" alt="在这里插入图片描述" />

  • 输入用户名和密码
    https://img-blog.csdnimg.cn/direct/6e8c08ff642d4ee89d5741f95c7f7c4e.png" alt="在这里插入图片描述" />

http://www.ppmy.cn/server/29859.html

相关文章

flutter-解决AppBar背景色为白色带滚动时不生效的bug

作为初学flutter的小白来说,今天在模仿小米商城app的首页appbar的时候,遇到一个奇怪的问题,就是修改AppBar的backgroundColor,在首页上拉滚动时,设置的白色背景色不生效,背景色变成不是淡灰色,其他深色不影…

【21-模型持久化:保存和加载Scikit-learn模型】

文章目录 前言模型持久化的重要性使用`joblib`保存和加载模型安装`joblib`保存模型加载模型使用`pickle`进行模型持久化注意事项结论前言 在机器学习的实践中,模型持久化是一个至关重要的环节。它允许我们保存模型的当前状态,以便未来能够无需重新训练即可重用模型。本文将指…

python+Pyppeteer+SpringBoot验证码自动识别登录(文末附源码)

效果如下: 实现流程: 一、Pyppeteer打开网址 import asyncio from pyppeteer import launch import pdb import random# 启动 Pyppeteer browser await launch({headless: False}) page await browser.newPage()# 打开登录页面 await page.goto(http…

Unity SteamVR入门

概述 VR项目现在在当前已经是非常热门的技术,可以给玩家身临其境的感觉,接下来让我们学习这部分的内容吧! SteamVR Input SteamVR绑定流程,在Windows窗口的点击SteamVR-input,图1,在这里可以选择你需要绑定…

C语言练习百题之计算字符串中子串出现的次数

程序分析 计算字符串中子串出现的次数,一种直观的方法是遍历整个字符串,在每个位置检查子串是否匹配。另一种方法是利用字符串匹配算法来优化搜索过程,减少时间复杂度。 方法一:暴力法 解题思路: 在主串中依次遍历…

Mybatis基础

1. Myabtis参数的获取 在Mybatis中获取参数是非常常见的操作,无论是增删改查哪种操作,基本都会传入参数。 1.1 获取单个参数 单个参数:mybatis不会做特殊处理, #{参数名/任意名}:取出参数值 1.2 获取多个参数 多个…

python 学习: 矩阵运算

摘要: 本贴通过例子描述 python 的矩阵运算. 1. 一般乘法 (mm 与 matmul) 代码: input_mat1 torch.tensor([[1, 2, 3, 4],[1, 2, 2, 3]])input_mat2 torch.tensor([[1, 2, 3, 3],[2, 1, 2, 3],[3, 1, 2, 2],[2, 3, 2, 3]])print("input_mat1: ", input_mat1)prin…

SpringDI方式及Redis应用场景的分享

1、为什么Spring和IDEA 都不推荐使用 Autowired 注解 大家在使用IDEA开发的时候有没有注意到过一个提示,在字段上使用Spring的依赖注入注解Autowired后会出现如下警告Field injection is not recommended (字段注入是不被推荐的);但是使用Resource却不会…