知者何南 发表于 2025-2-21 22:35:30

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

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

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

公众号:不止极客

Nginx 的初步认识及设置
课程目标


[*]Nginx 在分布式架构中的应用分析
[*]常用的 Web 服务器及差异
[*]Nginx 的安装以及设置分析
[*]Nginx 虚拟主机设置
[*]详解 Location 的匹配规则
背景

早期用 F5 做负载均衡
https://img2024.cnblogs.com/other/2396776/202502/2396776-20250221232019312-1668501656.png
后来通过负载均衡和热备来提高整个的 QPS。
https://img2024.cnblogs.com/other/2396776/202502/2396776-20250221232019643-2130354330.png
什么是 Nginx

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

[*]正向代理代理的是客户端
[*]反向代理代理的是服务端
Apache、Tomcat、Nginx

​        都是 HTTP 服务器,他们都会放到我们服务端的服务器上,通过绑定 IP 和 端口的方式,去监听一个端口号。接收客户端的 HTTP 哀求。
https://img2024.cnblogs.com/other/2396776/202502/2396776-20250221232019830-735924004.png
展示给用户端。
JSP 是动态资源。
apache、nginx静态文件服务器css / jsTomcat动态文件服务器jsp / servletapache有一些性能瓶颈的Nginx主要是用来处理惩罚高并发的哀求Nginx 和 Apache 也是可以做动态解析的,但是它本身不是做这个的。
Nginx 功能


[*]反向代理。
[*]流量分发
[*]动静分离
[*]认证
[*]授权
它照旧一个高度模块化的设计
安装 Nginx

http://nginx.org/download/
# mkdir nginx
# cd 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.

# yum install pcre-devel
# ./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.

   
# yum install -y zlib-devel

# ./configure --prefix=/software/nginx

# make && make install
# cd 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

# cd 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
# ./nginx
# ./nginx -s stop
[*]下载 tar 包
[*]tar -zxvf nginx.tar.gz
[*]./configure [--prefix]
[*]make && make install
启动和停止


[*]./nginx
[*]./nginx -s stop
https://img2024.cnblogs.com/other/2396776/202502/2396776-20250221232020027-1675268926.png
nginx.conf

# cd conf/
# ll
总用量 60
-rw-r--r--. 1 root root979 1月17 13:58 fastcgi.conf
-rw-r--r--. 1 root root979 1月17 13:59 fastcgi.conf.default
-rw-r--r--. 1 root root909 1月17 13:58 fastcgi_params
-rw-r--r--. 1 root root909 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 root544 1月17 13:58 scgi_params
-rw-r--r--. 1 root root544 1月17 13:59 scgi_params.default
-rw-r--r--. 1 root root570 1月17 13:58 uwsgi_params
-rw-r--r--. 1 root root570 1月17 13:59 uwsgi_params.default
-rw-r--r--. 1 root root 3610 1月17 13:59 win-utf
# vim nginx.conf#usernobody;
worker_processes1;

#error_loglogs/error.log;
#error_loglogs/error.lognotice;
#error_loglogs/error.loginfo;

#pid      logs/nginx.pid;


events {
    # 允许连接的最大数量
    worker_connections1024;
}


http {
    include       mime.types;
    default_typeapplication/octet-stream;

    #log_formatmain'$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_loglogs/access.logmain;

    sendfile      on;
    #tcp_nopush   on;

    #keepalive_timeout0;
    keepalive_timeout65;

    #gzipon;

    server {
      listen       80;
      server_namelocalhost;

      #charset koi8-r;

      #access_loglogs/host.access.logmain;

      location / {
            root   html;
            indexindex.html index.htm;
      }

      #error_page404            /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_indexindex.php;
      #    fastcgi_paramSCRIPT_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 {
      #    denyall;
      #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_namesomenamealiasanother.alias;

    #    location / {
    #      root   html;
    #      indexindex.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_namelocalhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_keycert.key;

    #    ssl_session_timeout5m;

    #    ssl_protocolsSSLv2 SSLv3 TLSv1;
    #    ssl_ciphersHIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #      root   html;
    #      indexindex.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;
    }
}# ./sbin/nginx
# ./sbin/nginx -s reload
# ps -ef|grep nginx
root       9595      10 15:16 ?      00:00:00 nginx: master process ./sbin/nginx
nobody   9596   95950 15:16 ?      00:00:00 nginx: worker process
root       9619   95500 15:28 pts/2    00:00:00 grep --color=auto nginx必要去 html 目录下创建几个文件
# ll
总用量 24
-rw-r--r--. 1 root root383 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 root151 1月17 13:58 index.html
-rw-r--r--. 1 root root 7133 1月17 13:58 ngx_core_module.html可能必要刷新 DNS
https://img2024.cnblogs.com/other/2396776/202502/2396776-20250221232020374-1080441302.png
https://img2024.cnblogs.com/other/2396776/202502/2396776-20250221232020537-463695916.png
https://img2024.cnblogs.com/other/2396776/202502/2396776-20250221232020716-455671851.png
https://img2024.cnblogs.com/other/2396776/202502/2396776-20250221232020933-1523016844.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(静态资源服务器,可以做压缩的)
匹配规则是不能重复的。

[*]精准匹配是优先级最高
[*]普通匹配(最长的匹配)
[*]正则匹配
现实利用建议

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

​        Nginx 内部都是由一些核心和非核心的第三方模块组成的。它的模块化,我们可以做一些动态的集成和扩展。
​        除了它本身的功能以外,我们还可以利用第三方的设置去实现更复杂的功能。

默认的:

[*]反向代理
[*]email
[*]nginx core
模块分类


[*]核心模块 ngx_http_core_module
[*]尺度模块 http模块
[*]第三方模块
可以把 模块当作插件
ngx_http_core_module

server{
    listen port
      server_name   ...
      localtion{
      root ...
    }
}Location 实现 URI 到文件系统路径的映射

[*]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 的访问控制功能

[*]allow address | CIDR | unix: | all;
[*]deny address | CIDR | unix: | all;
https://img2024.cnblogs.com/other/2396776/202502/2396776-20250221232021162-2041463752.png
自上而下查抄,一旦匹配,将生效,条件严格的置前
可以用 -t 来看语法有没有问题
# ./nginx -t如何添加第三方模块

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

[*]原来所安装的设置,你必须在重新安装新模块的时间,加上
[*]不能直接 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# cd ../nginx-1.1.4/

# ./configure --prefix=/software/nginx --with-http_stub_status_module --with-http_random_index_module

# ps -ef|grep nginx
root       9595      10 15:16 ?      00:00:00 nginx: master process ./sbin/nginx
nobody   9755   95950 16:25 ?      00:00:00 nginx: worker process
root      13696   95500 19:35 pts/2    00:00:00 grep --color=auto nginx
# kill -9 9595
# kill -9 9755
# ps -ef|grep nginx
root      13699   95500 19:35 pts/2    00:00:00 grep --color=auto nginx

# cp objs/nginx ../nginx/sbin/nginx
cp:是否覆盖"../nginx/sbin/nginx"? y
# 如果直接 make && make install 会直接就没了。
以是 更换。
# kill -9 13713
# ./configure --prefix=/software/nginx --with-http_stub_status_module --with-http_random_index_module
# make
# cp objs/nginx ../nginx/sbin/nginx
cp:是否覆盖"../nginx/sbin/nginx"? yhttp_stub_status_module

location /status{
    stub_status on;
}https://img2024.cnblogs.com/other/2396776/202502/2396776-20250221232021406-632956555.png

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

www.darian.com
随机显示主页
​        一般情况下,一个站点默认首页都是定义好的 index.html 、 index.shtml 等等,如果站点下有很多页面想随机展示给用户浏览,那得步伐上实现,很麻烦,利用 nginx 的 random index 即可简朴实现这个功能,凡是以/结尾的哀求,都会随机展示当前目录下的文件作为首页

[*]添加 random_index on 设置,默认是关闭的
location / {
    root html;
    random_index on;
    index index.html index.htm;
}
[*]在 html 目录下创建多个 html 页面
他就会多个 HTML 页面随机地展示在首页。
( 官方的模块,你可以直接通过 with model 去集成,如果是下载第三方插件可以通过 http model 去集成。 )
百万架构师系列文章阅读体验感更佳

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

公众号:不止极客

泉源于:https://javaguide.net
微信公众号:不止极客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 百万架构师第四十二课:Nginx:Nginx 的初步认识|JavaGuide