首页
编程语言

分类

当前位置: 天天编程网 > 技术新闻 > 编程语言 >正文

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

更新时间:2025-02-22  作者:佚名   来源: 网络转载

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

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

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

公众号:不止极客

Nginx 的初步认识及配置

课程目标

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

背景

早期用 F5 做负载均衡

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

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

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

什么是 Nginx

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

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

Apache、Tomcat、Nginx

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

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

展示给用户端。

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

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

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

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

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

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

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

用本地 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 port
        server_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;

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

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

可以用 -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;
}

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

  • 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

微信公众号:不止极客

上一篇:AI大模型有哪些常见的应用场景 下一篇:百万架构师第四十二课:Nginx:Nginx 的初步认识|JavaGuide
小编推荐
快速导航更多>>
JavaScript 教程 HTML5 教程 CSS3 教程 jQuery 教程 Vue.js 教程 Node.js 教程 SQL 教程 C 教程 PHP 教程 Linux 教程 Docker 教程 Nginx 教程 Python 教程 Java 教程

天天编程网 版权所有

陕ICP备2023002928号-1