NGINX

对于这东西的理解也就是一个高性能web容器吧

NGINX进程工作原理

NGINX 的进程工作原理可以简要描述为以下几个步骤:

  1. 主进程启动:当 NGINX 服务启动时,一个主进程(通常是 nginx 进程)会被创建并开始执行。

  2. 监听端口:主进程会打开配置文件指定的监听端口,并开始监听来自客户端的连接请求。

  3. 创建工作进程:主进程会创建一定数量的工作进程(通常是 nginx worker 进程),这些工作进程将负责实际处理客户端请求。

  4. 接收连接:主进程接收到客户端的连接请求后,会将连接分配给一个空闲的工作进程。

  5. 处理请求:工作进程接收到连接后,开始处理客户端的请求。它会读取请求数据、解析请求头、执行相应的操作(例如返回静态文件、转发请求给后端服务器等)。

  6. 并发处理:NGINX 的工作进程使用事件驱动的模型,在一个进程中可以同时处理多个并发连接,而不是为每个连接创建一个线程或进程。这种非阻塞的处理方式使得 NGINX 能够高效地处理大量的并发请求。

  7. 响应返回:处理完客户端请求后,工作进程会生成相应的响应,并将响应返回给客户端。

  8. 继续监听:工作进程处理完一个请求后,会继续监听新的连接,以便处理更多的请求。

  9. 信号处理:主进程负责处理系统信号,例如重新加载配置文件、平滑重启等操作。通过发送信号给主进程,可以实现对 NGINX 的动态配置和管理。

NGINX 的进程模型采用了主进程和多个工作进程的设计,主进程负责管理工作进程、接收连接和处理信号,而工作进程则负责实际的请求处理。这种架构使得 NGINX 能够高效地处理并发请求,并具有良好的稳定性和可靠性。

NGINX工作原理

NGINX 是一款高性能的开源 Web 服务器和反向代理服务器。它的工作原理可以概括为以下几个步骤:

  1. 监听端口:NGINX 在服务器上监听一个或多个指定的端口,通常是 80(HTTP)和 443(HTTPS)。

  2. 接收请求:当客户端发送请求到 NGINX 的监听端口时,NGINX 接收到该请求。

  3. 处理请求:NGINX 根据预先配置的规则,对请求进行处理。这包括匹配请求的 URL、请求方法、请求头等信息。

  4. 静态文件处理:如果请求的是静态文件(例如 HTML、CSS、JavaScript、图像等),NGINX 可以直接返回这些文件给客户端,无需转发请求给后端应用服务器。

  5. 反向代理:如果请求需要经过反向代理,NGINX 可以将请求转发给后端应用服务器处理。NGINX 作为反向代理服务器,可以根据负载均衡算法将请求分发给多个后端服务器,提高系统的性能和可靠性。

  6. 处理响应:NGINX 接收到后端服务器的响应后,可以对响应进行处理,例如修改响应头、缓存响应内容等。

  7. 返回响应:最后,NGINX 将处理后的响应返回给客户端。

NGINX 的高性能主要得益于其事件驱动的异步非阻塞架构。它使用少量的系统资源来处理大量的并发连接,具有出色的性能和可扩展性。此外,NGINX 还支持许多高级功能,如反向代理、负载均衡、SSL/TLS 加密、HTTP 缓存、动态模块等,使其成为一个强大而灵活的 Web 服务器和代理服务器。

关于配置文件

NGINX一些常用命令

以下是一些常用的 NGINX 命令:

  1. 启动 NGINX 服务:

    sudo systemctl start nginx
    
  2. 停止 NGINX 服务:

    sudo systemctl stop nginx
    
  3. 重新启动 NGINX 服务:

    sudo systemctl restart nginx
    
  4. 检查 NGINX 配置文件语法是否正确:

    sudo nginx -t
    
  5. 重新加载 NGINX 配置文件:

    sudo systemctl reload nginx
    
  6. 查看 NGINX 服务状态:

    sudo systemctl status nginx
    
  7. 查看 NGINX 日志文件:

    sudo tail -f /var/log/nginx/error.log  # 错误日志
    sudo tail -f /var/log/nginx/access.log  # 访问日志
    
  8. 测试 NGINX 是否在监听指定的端口:

    sudo netstat -tuln | grep 80  # 替换 80 为你想要检查的端口号
    

**
这些命令可以帮助你管理 NGINX 服务,启动、停止、重新加载配置文件以及查看日志和服务状态。请注意,根据你的系统配置,可能需要使用 sudo 或以 root 用户身份执行这些命令。**

配置文件内容

user  www www;   #启动用户
worker_processes auto; 工作进程数量,默认自动
error_log  /www/wwwlogs/nginx_error.log  crit;   #一些错误日志啊
pid        /www/server/nginx/logs/nginx.pid;   #pid进程文件
worker_rlimit_nofile 51200;
    access_log /www/wwwlogs/tcp-access.log tcp_format;
    error_log /www/wwwlogs/tcp-error.log;
    include /www/server/panel/vhost/nginx/tcp/*.conf;   #匹配该文件夹下的其他配置文件
    
    上面是全局块
    
}
events
    {
        use epoll;
        worker_connections 51200;  #最大连接数
        multi_accept on;
    }
    上面是events块
    
http
    {
        include       mime.types;   #文件处理规则
        gzip on;  #压缩开启

http块内包括server块

server
    {
        listen 888;  #监听端口888
        server_name phpmyadmin;   #服务名,用于匹配到该站点
        index index.html index.htm index.php;  #匹配默认页面
        root  /www/server/phpmyadmin;  #网站路径
            location ~ /tmp/ {
                return 403;
            }

        access_log  /www/wwwlogs/access.log;  #网站日志
    }
include /www/server/panel/vhost/nginx/*.conf;   #匹配改文件夹下其他站点规则
}

NGINX负载均衡

负载均衡配置写在http配置里面和server块里面好像都可以
以下是GPT写的一个示例

http {
    upstream backend {  #这是负载均衡服务器模块,后面是组名可以自定义
        server 127.0.0.1:8080;    #这是加入的服务器,可以设置程成域名
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }

    server {
        listen 8080;
        server_name 127.0.0.1;

        location / {
            root /www/fzjh1;
            index index.html;
        }
    }

    server {
        listen 8081;
        server_name 127.0.0.1;

        location / {
            root /www/fzjh2;
            index index.html;
        }
    }

    server {
        listen 8082;
        server_name 127.0.0.1;

        location / {
            root /www/fzjh3;
            index index.html;
        }
    }
}

NGINX编译安装

安装依赖以及编译环境

apt install gcc openssl libssl-dev  libpcre3 libpcre3-dev  zlib1g-dev

生产编译文件,可添加模块

./configure  --prefix=/usr/local/nginx --with-stream

编译以及安装

make & make install

nginx编译参数

–prefix= 指向安装目录

–sbin-path 指向(执行)程序文件(nginx)

–conf-path= 指向配置文件(nginx.conf)

–error-log-path= 指向错误日志目录

–pid-path= 指向pid文件(nginx.pid)

–lock-path= 指向lock文件(nginx.lock)(安装文件锁定,防止安装文件被别人利用,或自己误操作。)

–user= 指定程序运行时的非特权用户

–group= 指定程序运行时的非特权用户组

–builddir= 指向编译目录

–with-rtsig_module 启用rtsig模块支持(实时信号)

–with-select_module 启用select模块支持(一种轮询模式,不推荐在高载环境下使用)禁用:–without-select_module

–with-poll_module 启用poll模块支持(功能与select相同,与select特性相同,为一种轮询模式,不推荐在高载环境下使用)

–with-file-aio 启用file aio支持(一种APL文件传输格式)

–with-ipv6 启用ipv6支持

–with-http_ssl_module 启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)

–with-http_realip_module 启用ngx_http_realip_module支持(这个模块允许从请求标头更改客户端的IP地址值,默认为关)

–with-http_addition_module 启用ngx_http_addition_module支持(作为一个输出过滤器,支持不完全缓冲,分部分响应请求)

–with-http_xslt_module 启用ngx_http_xslt_module支持(过滤转换XML请求)

–with-http_image_filter_module 启用ngx_http_image_filter_module支持(传输JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。gd库要用到)

–with-http_geoip_module 启用ngx_http_geoip_module支持(该模块创建基于与MaxMind GeoIP二进制文件相配的客户端IP地址的ngx_http_geoip_module变量)

–with-http_sub_module 启用ngx_http_sub_module支持(允许用一些其他文本替换nginx响应中的一些文本)

–with-http_dav_module 启用ngx_http_dav_module支持(增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)默认情况下为关闭,需编译开启

–with-http_flv_module 启用ngx_http_flv_module支持(提供寻求内存使用基于时间的偏移量文件)

–with-http_gzip_static_module 启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)

–with-http_random_index_module 启用ngx_http_random_index_module支持(从目录中随机挑选一个目录索引)

–with-http_secure_link_module 启用ngx_http_secure_link_module支持(计算和检查要求所需的安全链接网址)

–with-http_degradation_module 启用ngx_http_degradation_module支持(允许在内存不足的情况下返回204或444码)

–with-http_stub_status_module 启用ngx_http_stub_status_module支持(获取nginx自上次启动以来的工作状态)

–without-http_charset_module 禁用ngx_http_charset_module支持(重新编码web页面,但只能是一个方向–服务器端到客户端,并且只有一个字节的编码可以被重新编码)

–without-http_gzip_module 禁用ngx_http_gzip_module支持(该模块同-with-http_gzip_static_module功能一样)

–without-http_ssi_module 禁用ngx_http_ssi_module支持(该模块提供了一个在输入端处理处理服务器包含文件(SSI)的过滤器,目前支持SSI命令的列表是不完整的)

–without-http_userid_module 禁用ngx_http_userid_module支持(该模块用来处理用来确定客户端后续请求的cookies)

–without-http_access_module 禁用ngx_http_access_module支持(该模块提供了一个简单的基于主机的访问控制。允许/拒绝基于ip地址)

–without-http_auth_basic_module禁用ngx_http_auth_basic_module(该模块是可以使用用户名和密码基于http基本认证方法来保护你的站点或其部分内容)

–without-http_autoindex_module 禁用disable ngx_http_autoindex_module支持(该模块用于自动生成目录列表,只在ngx_http_index_module模块未找到索引文件时发出请求。)

–without-http_geo_module 禁用ngx_http_geo_module支持(创建一些变量,其值依赖于客户端的IP地址)

–without-http_map_module 禁用ngx_http_map_module支持(使用任意的键/值对设置配置变量)

–without-http_split_clients_module 禁用ngx_http_split_clients_module支持(该模块用来基于某些条件划分用户。条件如:ip地址、报头、cookies等等)

–without-http_referer_module 禁用disable ngx_http_referer_module支持(该模块用来过滤请求,拒绝报头中Referer值不正确的请求)

–without-http_rewrite_module 禁用ngx_http_rewrite_module支持(该模块允许使用正则表达式改变URI,并且根据变量来转向以及选择配置。如果在server级别设置该选项,那么他们将在 location之前生效。如果在location还有更进一步的重写规则,location部分的规则依然会被执行。如果这个URI重写是因为location部分的规则造成的,那么 location部分会再次被执行作为新的URI。 这个循环会执行10次,然后Nginx会返回一个500错误。)

–without-http_proxy_module 禁用ngx_http_proxy_module支持(有关代理服务器)

–without-http_fastcgi_module 禁用ngx_http_fastcgi_module支持(该模块允许Nginx 与FastCGI 进程交互,并通过传递参数来控制FastCGI 进程工作。 )FastCGI一个常驻型的公共网关接口。

–without-http_uwsgi_module 禁用ngx_http_uwsgi_module支持(该模块用来医用uwsgi协议,uWSGI服务器相关)

–without-http_scgi_module 禁用ngx_http_scgi_module支持(该模块用来启用SCGI协议支持,SCGI协议是CGI协议的替代。它是一种应用程序与HTTP服务接口标准。它有些像FastCGI但他的设计 更容易实现。)

–without-http_memcached_module 禁用ngx_http_memcached_module支持(该模块用来提供简单的缓存,以提高系统效率)

-without-http_limit_zone_module 禁用ngx_http_limit_zone_module支持(该模块可以针对条件,进行会话的并发连接数控制)

–without-http_limit_req_module 禁用ngx_http_limit_req_module支持(该模块允许你对于一个地址进行请求数量的限制用一个给定的session或一个特定的事件)

–without-http_empty_gif_module 禁用ngx_http_empty_gif_module支持(该模块在内存中常驻了一个1*1的透明GIF图像,可以被非常快速的调用)

–without-http_browser_module 禁用ngx_http_browser_module支持(该模块用来创建依赖于请求报头的值。如果浏览器为modern ,则modernbrowser等于modernbrowservalue指令分配的值;如果浏览器为old,则modern_browser等于modern_browser_value指令分配的值;如 果浏览器为old,则ancient_browser等于 ancient_browser_value指令分配的值;如果浏览器为 MSIE中的任意版本,则 $msie等于1)

–without-http_upstream_ip_hash_module 禁用ngx_http_upstream_ip_hash_module支持(该模块用于简单的负载均衡)

–with-http_perl_module 启用ngx_http_perl_module支持(该模块使nginx可以直接使用perl或通过ssi调用perl)

–with-perl_modules_path= 设定perl模块路径

–with-perl= 设定perl库文件路径

–http-log-path= 设定access log路径

–http-client-body-temp-path= 设定http客户端请求临时文件路径

–http-proxy-temp-path= 设定http代理临时文件路径

–http-fastcgi-temp-path= 设定http fastcgi临时文件路径

–http-uwsgi-temp-path= 设定http uwsgi临时文件路径

–http-scgi-temp-path= 设定http scgi临时文件路径

-without-http 禁用http server功能

–without-http-cache 禁用http cache功能

–with-mail 启用POP3/IMAP4/SMTP代理模块支持

–with-mail_ssl_module 启用ngx_mail_ssl_module支持

–without-mail_pop3_module 禁用pop3协议(POP3即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。是因特网电子邮件的第一个离线协议标 准,POP3协议允许用户从服务器上把邮件存储到本地主机上,同时根据客户端的操作删除或保存在邮件服务器上的邮件。POP3协议是TCP/IP协议族中的一员,主要用于 支持使用客户端远程管理在服务器上的电子邮件)

–without-mail_imap_module 禁用imap协议(一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。IMAP协议运行在TCP/IP协议之上, 使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。)

–without-mail_smtp_module 禁用smtp协议(SMTP即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。)

–with-google_perftools_module 启用ngx_google_perftools_module支持(调试用,剖析程序性能瓶颈)

–with-cpp_test_module 启用ngx_cpp_test_module支持

–add-module= 启用外部模块支持

–with-cc= 指向C编译器路径

–with-cpp= 指向C预处理路径

–with-cc-opt= 设置C编译器参数(PCRE库,需要指定–with-cc-opt=”-I /usr/local/include”,如果使用select()函数则需要同时增加文件描述符数量,可以通过–with-cc- opt=”-D FD_SETSIZE=2048”指定。)

–with-ld-opt= 设置连接文件参数。(PCRE库,需要指定–with-ld-opt=”-L /usr/local/lib”。)

–with-cpu-opt= 指定编译的CPU,可用的值为: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64

–without-pcre 禁用pcre库

–with-pcre 启用pcre库

–with-pcre= 指向pcre库文件目录

–with-pcre-opt= 在编译时为pcre库设置附加参数

–with-md5= 指向md5库文件目录(消息摘要算法第五版,用以提供消息的完整性保护)

–with-md5-opt= 在编译时为md5库设置附加参数

–with-md5-asm 使用md5汇编源

–with-sha1= 指向sha1库目录(数字签名算法,主要用于数字签名)

–with-sha1-opt= 在编译时为sha1库设置附加参数

–with-sha1-asm 使用sha1汇编源

–with-zlib= 指向zlib库目录

–with-zlib-opt= 在编译时为zlib设置附加参数

–with-zlib-asm= 为指定的CPU使用zlib汇编源进行优化,CPU类型为pentium, pentiumpro

–with-libatomic 为原子内存的更新操作的实现提供一个架构

–with-libatomic= 指向libatomic_ops安装目录

–with-openssl= 指向openssl安装目录

–with-openssl-opt 在编译时为openssl设置附加参数

–with-debug 启用debug日志

Docker

我把他理解为一个可以搭建任何虚拟环境的容器

关于docker一些常用的命令

Docker 是一种流行的容器化平台,用于构建、部署和运行应用程序。下面是一些常用的 Docker 命令:

  1. docker run: 运行一个容器。

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
  2. docker build: 构建一个镜像。

    docker build [OPTIONS] PATH | URL | -
    
  3. docker pull: 从 Docker 镜像仓库中拉取一个镜像。

    docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    
  4. docker push: 将一个镜像推送到 Docker 镜像仓库。

    docker push [OPTIONS] NAME[:TAG]
    
  5. docker images: 列出本地的镜像。

    docker images [OPTIONS] [REPOSITORY[:TAG]]
    
  6. docker ps: 列出正在运行的容器。

    docker ps [OPTIONS]
    
  7. docker stop: 停止一个或多个容器。

    docker stop [OPTIONS] CONTAINER [CONTAINER...]
    
  8. docker rm: 删除一个或多个容器。

    docker rm [OPTIONS] CONTAINER [CONTAINER...]
    
  9. docker rmi: 删除一个或多个镜像。

    docker rmi [OPTIONS] IMAGE [IMAGE...]
    
  10. docker exec: 在正在运行的容器中执行命令。

    docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    
  11. docker 清理构建缓存

docker builder prune

一些启动参数

当在Docker中使用docker run命令时,你可以通过添加其他参数来控制容器的行为和配置。以下是一些常用的docker run命令的其他参数:

  • -d:以后台(守护进程)模式运行容器。
  • -it:启动一个交互式终端,并将其连接到容器的标准输入、输出和错误(通常与-d一起使用)。
  • --name <容器名称>:为容器指定一个名称。
  • -e <变量名>=<值>:设置环境变量。
  • -v <本地路径>:<容器路径>:将本地文件系统的路径挂载到容器内的路径。
  • --network=<网络名称>:将容器连接到指定的Docker网络。
  • --link <容器名称或ID>:<别名>:连接到另一个容器,并在当前容器中设置一个别名。
  • -p <主机端口>:<容器端口>:将主机的端口映射到容器的端口。
  • --restart=<策略>:指定容器的重启策略,例如noon-failurealways
  • --rm:容器退出时自动删除容器。
  • --privileged:给容器分配所有特权,这将允许容器访问主机上的所有设备。

这只是一些常见的docker run命令的参数,还有更多参数可以根据需要使用。你可以通过运行docker run --help命令来查看所有可用参数的完整列表和说明。

更改重新启动策略

docker update --restart=策略 容器ID或名称

no:不自动重启容器。
on-failure:仅在容器非正常退出时重启容器(退出状态码不为 0)。
always:总是重启容器,无论退出状态码是什么。
unless-stopped:除非手动停止容器,否则总是重启容器。

dockr推送到仓库

要将一个镜像推送到Docker仓库,你需要完成以下步骤:

  1. 登录到Docker仓库:使用docker login命令登录到目标Docker仓库。你需要提供Docker仓库的地址、用户名和密码。

    docker login <仓库地址>
    

    例如:

    docker login myregistry.example.com
    
  2. 标记镜像:使用docker tag命令给要推送的镜像打上合适的标签。标签的格式通常是<仓库地址>/<用户名>/<镜像名称>:<标签>

    docker tag <本地镜像名称> <仓库地址>/<用户名>/<镜像名称>:<标签>
    

    例如:

    docker tag myimage:latest myregistry.example.com/myuser/myimage:latest
    
  3. 推送镜像:使用docker push命令将标记的镜像推送到Docker仓库。

    docker push <仓库地址>/<用户名>/<镜像名称>:<标签>
    

    例如:

    docker push myregistry.example.com/myuser/myimage:latest
    

    这将把镜像上传到Docker仓库中。

请注意,以上步骤中的仓库地址、用户名、镜像名称和标签应根据你的实际情况进行替换。

容器以及创建好的情况下,如何带参数执行

Docker网络

断开容器与当前网络的连接

docker network disconnect 当前网络 容器ID或名称

启动容器并将网络模式设置为桥接

docker start --network=bridge 容器ID或名称

创建一个新的桥接网络

docker network create --driver bridge 新网络名称

将容器连接到新的桥接网络

docker network connect 新网络名称 容器ID或名称

创建一个桥接网络

docker network create --driver bridge my-bridge-network

运行容器并连接到桥接网络

docker run --network=my-bridge-network --name=my-container -d image-name

创建一个自定义的桥接网络,指定网段为 192.x.x.x。例如,创建一个名为 my-bridge-network 的桥接网络,并指定子网为 192.168.0.0/24

docker network create --driver bridge --subnet=192.168.0.0/24 my-bridge-network

运行容器并连接到自定义的桥接网络,并指定容器的 IP 地址为 192.168.0.x,其中 x 是一个可用的 IP 地址

docker run --network=my-bridge-network --ip=192.168.0.x --name=my-container -d image-name