百万架构师第四十二课:Nginx:Nginx 的初步认识|JavaGuide

news/2025/2/21 23:24:35/文章来源:https://www.cnblogs.com/nogeek-cn/p/18730425

百万架构师系列文章阅读体验感更佳

原文链接:https://javaguide.net

公众号:不止极客

Nginx 的初步认识及配置

课程目标

  1. Nginx 在分布式架构中的应用分析
  2. 常用的 Web 服务器及差异
  3. Nginx 的安装以及配置分析
  4. Nginx 虚拟主机配置
  5. 详解 Location 的匹配规则

背景

早期用 F5 做负载均衡

JavaGuide_Nginx_初步认识_背景_F5.png

后来通过负载均衡和热备来提高整个的 QPS。

JavaGuide_Nginx_初步认识_Nginx负载均衡.png

什么是 Nginx

Nginx 是一个高性能的反向代理服务器

  • 正向代理代理的是客户端
  • 反向代理代理的是服务端

Apache、Tomcat、Nginx

​ 都是 HTTP 服务器,他们都会放到我们服务端的服务器上,通过绑定 IP 和 端口的方式,去监听一个端口号。接收客户端的 HTTP 请求。

JavaGuide_Nginx_初步认识_http_server代理.png

展示给用户端。

JSP 是动态资源。

apache、nginx 静态文件服务器 css / js
Tomcat 动态文件服务器 jsp / servlet
apache 有一些性能瓶颈的
Nginx 主要是用来处理高并发的请求

Nginx 和 Apache 也是可以做动态解析的,但是它本身不是做这个的。

Nginx 功能

  • 反向代理。
  • 流量分发
  • 动静分离
  • 认证
  • 授权

它还是一个高度模块化的设计

安装 Nginx

http://nginx.org/download/

[root@Darian1 software]# mkdir nginx
[root@Darian1 software]# cd nginx-1.1.4/
[root@Darian1 nginx-1.1.4]# ./configure --prefix=/software/nginx./configure: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.[root@Darian1 nginx-1.1.4]# yum install pcre-devel
[root@Darian1 nginx-1.1.4]# ./configure --prefix=/software/nginx./configure: error: the HTTP gzip module requires the zlib library.
You can either disable the module by using --without-http_gzip_module
option, or install the zlib library into the system, or build the zlib library
statically from the source with nginx by using --with-zlib=<path> option.[root@Darian3 nginx-1.4.1]# yum install -y zlib-devel[root@Darian1 nginx-1.1.4]# ./configure --prefix=/software/nginx[root@Darian1 nginx-1.1.4]# make && make install
[root@Darian1 software]# cd nginx[root@Darian1 nginx]# ll
总用量 4
drwxr-xr-x. 2 root root 4096 1月  17 13:58 conf
drwxr-xr-x. 2 root root   68 1月  17 13:58 html
drwxr-xr-x. 2 root root    6 1月  17 13:58 logs
drwxr-xr-x. 2 root root   36 1月  17 13:59 sbin[root@Darian1 nginx]# cd sbin/
[root@Darian1 sbin]# ll
总用量 1704
-rwxr-xr-x. 1 root root 868424 1月  17 13:59 nginx
-rwxr-xr-x. 1 root root 868424 1月  17 13:58 nginx.old
[root@Darian1 sbin]# ./nginx
[root@Darian1 sbin]# ./nginx -s stop
  1. 下载 tar 包
  2. tar -zxvf nginx.tar.gz
  3. ./configure [--prefix]
  4. make && make install

启动和停止

  1. ./nginx
  2. ./nginx -s stop

JavaGuide_Nginx_初步认识_Nginx欢迎界面.png

nginx.conf

[root@Darian1 nginx]# cd conf/
[root@Darian1 conf]# ll
总用量 60
-rw-r--r--. 1 root root  979 1月  17 13:58 fastcgi.conf
-rw-r--r--. 1 root root  979 1月  17 13:59 fastcgi.conf.default
-rw-r--r--. 1 root root  909 1月  17 13:58 fastcgi_params
-rw-r--r--. 1 root root  909 1月  17 13:59 fastcgi_params.default
-rw-r--r--. 1 root root 2837 1月  17 13:59 koi-utf
-rw-r--r--. 1 root root 2223 1月  17 13:59 koi-win
-rw-r--r--. 1 root root 3268 1月  17 13:58 mime.types
-rw-r--r--. 1 root root 3268 1月  17 13:59 mime.types.default
-rw-r--r--. 1 root root 2685 1月  17 13:58 nginx.conf
-rw-r--r--. 1 root root 2685 1月  17 13:59 nginx.conf.default
-rw-r--r--. 1 root root  544 1月  17 13:58 scgi_params
-rw-r--r--. 1 root root  544 1月  17 13:59 scgi_params.default
-rw-r--r--. 1 root root  570 1月  17 13:58 uwsgi_params
-rw-r--r--. 1 root root  570 1月  17 13:59 uwsgi_params.default
-rw-r--r--. 1 root root 3610 1月  17 13:59 win-utf
[root@Darian1 conf]# vim nginx.conf
#user  nobody;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {# 允许连接的最大数量worker_connections  1024;
}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;#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;#gzip  on;server {listen       80;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {root   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;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;#    location / {#        root   html;#        index  index.html index.htm;#    }#}# HTTPS server##server {#    listen       443;#    server_name  localhost;#    ssl                  on;#    ssl_certificate      cert.pem;#    ssl_certificate_key  cert.key;#    ssl_session_timeout  5m;#    ssl_protocols  SSLv2 SSLv3 TLSv1;#    ssl_ciphers  HIGH:!aNULL:!MD5;#    ssl_prefer_server_ciphers   on;#    location / {#        root   html;#        index  index.html index.htm;#    }#}}

Main

event

http

虚拟主机配置

针对不同的端口号做不同的访问,不同域名做不同的访问。

server {listen 80;  server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}
}

基于ip的虚拟主机

不演示

基于端口号的虚拟主机

server {listen 8080;server_name localhost;location / {root html;index index.html;}
}

我们可以配置一个端口段,去做不同的路由转发。

基于域名的虚拟主机

购买主域名以后,可以基于主域名开放很多二级域名。

www.darian.com / ask.darian.com / git.darian.com / bbs.darian.com

server{listen 8080;server_name localhost;location / {root html;index index.html;}
}
server{listen 80;server_name bbs.darian.com;location / {root html;index bbs.html;}
}
server{listen 80;server_name ask.darian.com;location / {root html;index ask.html;}
}
server{listen 80;server_name www.darian.com;location / {# 去这个目录下边找root html;index index.html;}
}
[root@Darian1 nginx]# ./sbin/nginx
[root@Darian1 nginx]# ./sbin/nginx -s reload
[root@Darian1 nginx]# ps -ef|grep nginx
root       9595      1  0 15:16 ?        00:00:00 nginx: master process ./sbin/nginx
nobody     9596   9595  0 15:16 ?        00:00:00 nginx: worker process
root       9619   9550  0 15:28 pts/2    00:00:00 grep --color=auto nginx

需要去 html 目录下创建几个文件

[root@Darian1 html]# ll
总用量 24
-rw-r--r--. 1 root root  383 1月  17 13:58 50x.html
-rw-r--r--. 1 root root   26 1月  17 16:13 ask.html
-rw-r--r--. 1 root root   25 1月  17 16:14 bbs.html
-rw-r--r--. 1 root root  151 1月  17 13:58 index.html
-rw-r--r--. 1 root root 7133 1月  17 13:58 ngx_core_module.html

可能需要刷新 DNS

JavaGuide_Nginx_初步认识_windows刷新DNS缓存.png

JavaGuide_Nginx_初步认识_DNS_域名1.png

JavaGuide_Nginx_初步认识_DNS_域名2.png

JavaGuide_Nginx_初步认识_DNS_域名3.png

用本地 host 实现了域名的解析。

二级域名随意创造,备案主域名就好了

建议

将配置单独抽出来,放到一个地方去统一地进行管理。

代理解决的事情

  • 负载均衡
  • 缓存
  • 限流
  • 内外网的隔离,做安全性的东西

location

​ nginx 里边,需要知道 location ,对 location 做一些请求的转发。

根据请求的 URI 匹配到对应的 location 以后,去做对应的转发。

配置语法

location [= | ~* | ^~ ] /uri/ {...}

配置规则

location = /uri 精准匹配
location ^~ /uri 前缀匹配
location ~ /uri
location / 通用匹配

规则的优先级

1 location = /
2 location = /index
3 location ^~ /article/
4 location ^~ /article/files/
5 location ~ \.(gif|png|js|css)$
6 location /http://192.168.11.154/   -> 1
http://192.168.11.154/index ->2
http://192.168.11.154/article/files/1.txt ->4
http://192.168.11.154/darian.png ->5

(静态资源服务器,可以做压缩的)

匹配规则是不能重复的。

  1. 精准匹配是优先级最高
  2. 普通匹配(最长的匹配)
  3. 正则匹配

实际使用建议

# 根目录的配置规则,首页是静态页面
location =/ {
}
# 通用匹配  http://192.168.40.128:8080/index.html
location / {
}
# 静态规则,做动静分离
location ~* \.(gif|....)${
}

Nginx模块

​ Nginx 内部都是由一些核心和非核心的第三方模块组成的。它的模块化,我们可以做一些动态的集成和扩展。

​ 除了它本身的功能以外,我们还可以利用第三方的配置去实现更复杂的功能。

默认的:

  • 反向代理
  • email
  • nginx core

模块分类

  1. 核心模块 ngx_http_core_module
  2. 标准模块 http模块
  3. 第三方模块

可以把 模块看成插件

ngx_http_core_module

server{listen portserver_name   ...localtion{root ...}
}

Location 实现 URI 到文件系统路径的映射

  1. error_page

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

ngx_http_access_module

实现基于 IP 的访问控制功能

  1. allow address | CIDR | unix: | all;
  2. deny address | CIDR | unix: | all;

JavaGuide_Nginx_初步认识_阻止所有的访问.png

自上而下检查,一旦匹配,将生效,条件严格的置前

可以用 -t 来看语法有没有问题

[root@Darian1 sbin]# ./nginx -t

如何添加第三方模块

Nginx 不支持动态去安装或者加载模块。安装别的代码的时候需要重新编译。(我们很少去编写模块)

  1. 原来所安装的配置,你必须在重新安装新模块的时候,加上
  2. 不能直接 make install
configure --prefix=/data/program/nginx

安装方法

./configure --prefix=/安装目录 --add-module = /第三方模块的目录
./configure --prefix=/data/program/nginx --with-http_stub_status_module --with-http_random_index_module
cp objs/nginx $nginx_home/sbin/nginx
[root@Darian1 nginx-1.1.4]# cd ../nginx-1.1.4/[root@Darian1 nginx-1.1.4]# ./configure --prefix=/software/nginx --with-http_stub_status_module --with-http_random_index_module[root@Darian1 nginx-1.1.4]# ps -ef|grep nginx
root       9595      1  0 15:16 ?        00:00:00 nginx: master process ./sbin/nginx
nobody     9755   9595  0 16:25 ?        00:00:00 nginx: worker process
root      13696   9550  0 19:35 pts/2    00:00:00 grep --color=auto nginx
[root@Darian1 nginx-1.1.4]# kill -9 9595
[root@Darian1 nginx-1.1.4]# kill -9 9755
[root@Darian1 nginx-1.1.4]# ps -ef|grep nginx
root      13699   9550  0 19:35 pts/2    00:00:00 grep --color=auto nginx[root@Darian1 nginx-1.1.4]# cp objs/nginx ../nginx/sbin/nginx
cp:是否覆盖"../nginx/sbin/nginx"? y
[root@Darian1 nginx-1.1.4]# 

如果直接 make && make install 会直接就没了。

所以 替换。

[root@Darian1 nginx-1.1.4]# kill -9 13713
[root@Darian1 nginx-1.1.4]# ./configure --prefix=/software/nginx --with-http_stub_status_module --with-http_random_index_module
[root@Darian1 nginx-1.1.4]# make
[root@Darian1 nginx-1.1.4]# cp objs/nginx ../nginx/sbin/nginx
cp:是否覆盖"../nginx/sbin/nginx"? y

http_stub_status_module

location /status{stub_status on;
}

JavaGuide_Nginx_初步认识_Nginx的内置status.png

  • Active connections:当前状态,活动状态的连接数
  • accepts:统计总值,已经接收的客户端请求的总数
  • handled:统计总值,已经处理完成的客户端请求的总数
  • requests:统计总值,客户端发来的总的请求数
  • Reading:当前状态,正在读取客户端请求报文首部的连接的连接数
  • Writing:当前状态,正在向客户端发送响应报文过程中的连接数
  • Waiting:当前状态,正在等待客户端发出请求的空闲连接数

http_random_index_module

www.darian.com

随机显示主页

​ 一般情况下,一个站点默认首页都是定义好的 index.htmlindex.shtml 等等,如果站点下有很多页面想随机展示给用户浏览,那得程序上实现,很麻烦,使用 nginxrandom index 即可简单实现这个功能,凡是以/结尾的请求,都会随机展示当前目录下的文件作为首页

  1. 添加 random_index on 配置,默认是关闭的

    location / {root html;random_index on;index index.html index.htm;
    }
    
  2. 在 html 目录下创建多个 html 页面

他就会多个 HTML 页面随机地展示在首页。

( 官方的模块,你可以直接通过 with model 去集成,如果是下载第三方插件可以通过 http model 去集成。 )

百万架构师系列文章阅读体验感更佳

原文链接:https://javaguide.net

公众号:不止极客

来源于: https://javaguide.net

微信公众号:不止极客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/887845.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

清华大学第5弹: 《DeepSeek与AI幻觉》 - 清华大学DeepSeek全套资料完整版 - 持续更新 - PDF免费下载

《DeepSeek与AI幻觉》报告探讨了AI幻觉的成因、评测方法及其影响,并以DeepSeek模型为例,分析数据偏差、知识固化等问题如何导致幻觉现象。报告还提出缓解策略,如联网搜索、提示词优化,并探讨AI幻觉在科学创新和艺术创作中的潜在价值。由清华大学新闻与传播学院与人工智能学…

win系统查看wife连接密码

win系统查看wife连接密码 1、win+R ,打开cmd 2、查看本机连过的WiFi名 netsh wlan show profiles3、获取WIFI密码 netsh wlan show profiles “WIFI名” key=clear密码如下

crypto做题记录

buuctf--wp Crypto 权限获得第一步: 看样子是windows系统存储用户密码哈希值的格式,密文一般存储在C:\Windows\System32\config\SAM文件中,只有具有管理员权限的用户才能通过特定工具(hashdump,pwdump)访问SAM文件,进行密码重置等操作。 下图表示用户名: 用户RID:500(用…

若依框架常见问题一

错误一:问题出在configuration和configLocation重复,如下图:修改方法也很简单,只要删除掉application.yml文件中的以下就可以解决:

Cypher Chapter 5: MECHANISED CRYPTOGRAPHY

Chapter 5: MECHANISED CRYPTOGRAPHY 恩格玛机示意图:谜题围绕恩格玛机展开。 PUZZLE1 Input/output: ABCDEFGHIJKLMNOPQRSTUVWXYZScrambler I: ABCDEFGHIJKLMNOPQRSTUVWXYZ UWYGADFPVZBECKMTHXSLRINQOJReflector: ABCDEFGHIJKLMNOPQRSTUVWXYZ YRUHQSLDPXNGOKMIEBFZCWVJATCiph…

学生成绩管理系统问题分析

代码来源:CNDS《学生成绩信息管理系统设计》 运行环境:Visual Studio 2022学生成绩信息管理系统设计 #include #include using namespace std; const int MAX_STUDENTS = 100; class Student { public:string name;int id;float score; }; class StudentManager { private:…

若依02

swagger 简单介绍Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务 官网:https://swagger.io/。 它的主要作用是:使得前后端分离开发更加方便,有利于团队协作 接口的文档在线自动生成,降低后端开发人员编写接口文档的负担 功能测试S…

AI大模型有哪些常见的应用场景

图像生成应用场景: 图像生成 功能描述: 根据文本描述或参考图生成高质量图片,支持艺术、写实等多种风格。 用法示例: 输入提示词(如“赛博朋克风格的城市夜景”),调整参数(分辨率、风格强度)。 代表应用: 即梦AI视频生成应用场景: 视频生成 功能描述: 从文本/图片生成视频…

『Python底层原理』--Python对象系统探秘

Python是一种非常灵活的编程语言,它的灵活性很大程度上来自于它的对象系统。 在Python中,一切都是对象,这意味着无论是数字、字符串,还是我们自己定义的类的实例,它们在底层都遵循相同的规则。 本文尝试揭开Python的对象系统的神秘面纱。 1. 对象和类型 在Python中,每个对…

MyBatis-Plus配置之 —— 配置冲突

MyBatis-Plus配置 在 SpringBoot 工程中,当使用 yml 文件为 MyBatis-Plus 添加配置时,可能会出现 “配置冲突” 的问题,即:配置项如下: # MyBatisPlus配置 mybatis-plus:configuration:map-underscore-to-camel-case: true #字段与属性,自动转换为驼峰命名# ...config…

TLV编码学习

TLV就是Tag+Length+Value Tag(1或者多字节): Tag首字节:Bit7:0表示tag只有1字节, 1表示tag是多字节Bit6表示通用编码tag还是私有编码tag解析第5bit为0/1分别表示Value字段按照基本类型编码或者TLV方式编码。 Bit0~4,如果 Tag Value小于31,直接放Tag Value,大于…

线性规划 - 对偶

线性规划 - 对偶定义 线性规划是一类满足限制条件为关于自变量的线性约束,且目标函数是关于自变量的线性函数的一类最优化问题。 对于一组自变量 \(x_i\),定义多元线性函数 \(f(x_1,x_2,\dots,x_n)=\sum\limits_{i=1}^na_ix_i\),称 \(f(x_1,x_2,\dots,x_n)\ge/\le/=b_i\) 为…