【云原生 | 22】Docker运行Web服务实战之Nginx

简介: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是内存利用率高,并发能力强。

 作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道第一名🏅 阿里云ACE认证高级工程师🏅

✒️个人主页:小鹏linux

💊个人社区:小鹏linux(个人社区)欢迎您的加入!

目录

1. Nginx介绍

2. 为什么Nginx比其他web服务器并发高

2.1 进程管理上的区别

2.2 网络IO模型的选择

2.3 进程的阻塞方式的区别

2.4 模块开发方向不同

2.5 Apache & Nginx差异对比

3. nginx配置文件详解

4.Nginx工作模式

4.1 master-worker:

4.2 单进程模式:

5. Docker中运行Nginx实验

5.1 使用官方镜像

5.2 自定义Web页面

 👑👑👑结束语👑👑👑


1. Nginx介绍

 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是内存利用率高,并发能力强。

2. 为什么Nginx比其他web服务器并发高

处理过程:每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到可能发生阻塞的地方。比如向后端服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果后端服务器返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有新的request 进来,他就可以很快再按这种方式处理。而一旦后端服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的。

2.1 进程管理上的区别

Apache:

        默认采用的是一个主进程 多个工作进程 每个工作进程管理一个线程 每

        个线程管理一个连接

        并发数 = 工作进程数 x 1

Nginx:

        一个主进程 多个工作进程 每个工作进程管理多个线程(最大到65535)

        并发数 = 工作进程数 x 单进程开启的线程数

        淘宝等电商用的web浏览器 Tengine ,相当与Nginx的换皮,通过nginx开源项目针对电商优化的产品

2.2 网络IO模型的选择

Apache:

        select模型

        select就是一个简单的选择模型(如排队请求网络资源,第一个人阻塞住第二个人依然要排着)

Nginx:

        epoll模型

        epoll更智能的网络管理模型(如排队第一个人阻塞住,会先把第二个人网络的 IO 请求提交出来)

2.3 进程的阻塞方式的区别

Apache:同步 阻塞型

Nginx:异步 非阻塞型

2.4 模块开发方向不同

Apache:安全模块众多

Nginx:高性能模块众多

2.5 Apache & Nginx差异对比

Apache

Nginx

配置繁琐

配置相对简单

原生支持动态和静态页面

支持静态页面

模块相对安全

高性能模块出产迅速、社区活跃

BUG 相对较少,消耗资源较多

BUG相对较多,节省资源

对加密支持较好

对反向代理支持较好

同步阻塞型应用

异步非阻塞型应用

3. nginx配置文件详解

user  www www;
#程序运行用户和组
worker_processes auto;
#启动进程,指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般等于cpu核心数目
error_log  /home/wwwlogs/nginx_error.log  crit;
#全局错误日志
pid        /usr/local/nginx/logs/nginx.pid;
#主进程PID保存文件
worker_rlimit_nofile 51200;
#文件描述符数量
events 
  {
    use epoll;  
  #使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能
  worker_connections 51200;  
  #工作进程的最大连接数量,根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行每个进程允许的最多连接数, 理论上每台nginx服务器的最大连接数为worker_processes*worker_connections,具体还要看服务器的硬件、带宽等。
  }
http 
#整体环境配置--网站配置
  {
         include       mime.types;
         default_type  application/octet-stream;
       #设定mime类型,文件传送类型由mime.type文件定义
             server_names_hash_bucket_size 128;   
       #保存服务器名字的hash表大小
             client_header_buffer_size 32k;     
       #客户端请求头部缓冲区大小
             large_client_header_buffers 4 32k;     
       #最大客户端头缓冲大小
             client_max_body_size 50m;        
       #客户端最大上传文件大小(M)
             sendfile on;
       #sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
             tcp_nopush     on;
       #这个是默认的,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。(只在sendfile on时有效)
             keepalive_timeout 60;
       #连接超时时间
             tcp_nodelay on;
       #禁用nagle算法,也即不缓存数据。有效解决网络阻塞
                fastcgi_connect_timeout 300;
                fastcgi_send_timeout 300;
                fastcgi_read_timeout 300;
                fastcgi_buffer_size 64k;
                fastcgi_buffers 4 64k;
                fastcgi_busy_buffers_size 128k;
                fastcgi_temp_file_write_size 256k;
        #fastcgi设置
            gzip on;
            gzip_min_length  1k;
            gzip_buffers     4 16k;
            gzip_http_version 1.1;
            gzip_comp_level 2;
            gzip_types     text/plain application/javascript application/x-javascript text/javascript text/css application/xml application xml+rss;
            gzip_vary on;
            gzip_proxied   expired no-cache no-store private auth;
            gzip_disable   "MSIE [1-6]\.";
            #limit_conn_zone $binary_remote_addr zone=perip:10m;
            ##If enable limit_conn_zone,add "limit_conn perip 10;" to server section.
                server_tokens off;
        #隐藏nginx版本号(curl -I 192.168.4.154可以查看,更加安全)
                #log format
            log_format  access  '$remote_addr - $remote_user [$time_local] "$request"'
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $http_x_forwarded_for';
              #定义日志格式
  server
          {
                listen 80 default_server;
            #listen [::]:80 default_server ipv6only=on;
        #监听80端口,WEB服务的监听设置,可以采用"IP地址:端口"形式
                server_name www.lnmp.org lnmp.org;
        #服务器名,可以写多个域名,用空格分隔
                index index.html index.htm index.php;
        #默认网页文件
                root  /home/wwwroot/default;
        #网页主目录
        #error_page   404   /404.html;
        include enable-php.conf;
        location /nginx_status
                {
                    stub_status  on;  
                    access_log   off;
                }
        #开启status状态监测
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
                {
                    expires      30d;
                }
        #静态文件处理,保存期30天
        location ~ .*\.(js|css)?$
                {
                    expires      12h;
                }
        #js和css文件处理,保存期12小时
        location ~ /\.
                {
                    deny all;
                }
         access_log  /home/wwwlogs/access.log  access;
        #正确访问日志
      }
include vhost/*.conf;
#vhost/下子配置文件生效
}

image.gif

4.Nginx工作模式

 nginx有两种工作模式:master-worker模式和单进程模式。在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。

4.1 master-worker

该模式下,nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式,因为这种模式有以下优点:

1. 稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。

2. 配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能

3. 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启)

4.2 单进程模式:

 单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。(了解)

5. Docker中运行Nginx实验

5.1 使用官方镜像

用户可以使用docker run指令直接运行官方Nginx镜像:

$dockerrun-d-p80:80--namewebservernginx
34bcd01998a76f67b1b9e6abe5b7db5e685af325d6fafb1acd0ce84e81e71e5d

image.gif

然后使用docker ps指令查看当前运行的docker ps指令查看当前运行容器:

$ docker ps 
CONTAINER  ID     IMAGE     COMMAND     CREATED     STATUS     PORTS     NAMES 
34bcd01998a7      nginx "   nginx..."   2min ago Up 0.0.0.0:80->80/tcp, 443/tcp webserver

image.gif

目前Nginx容器已经在0.0.0.0:80启动,并映射了80端口,此时可以打开

浏览器访问此地址,就可以看到Nginx输出的页面,如图:

5.2 自定义Web页面

同样的,创建index.html文件,并将index.html文件挂载至容器中,即可看到显示自定义的页面。

$ docker run --name nginx-container -p 80:80 -v index.html:/usr/share/nginx/ html:ro -d nginx

image.gif

另外,也可以使用Dockerfile来构建新镜像。Dockerfile内容如下:

FROM nginx 
COPY ./index.html /usr/share/nginx/html

image.gif

开始构建镜像my-nginx:

$ docker build -t my-nginx .

image.gif

构建成功后执行docker run指令:

$ docker run --name nginx-container -d my-nginx

image.gif

 👑👑👑结束语👑👑👑

为大家推荐一款刷题神奇 点击链接访问牛客网

各大互联网大厂面试真题。基础题库到进阶题库等各类面试题应有尽有!

牛客网面经合集,满足大厂面试技术深度,快速构建Java核心知识体系大厂面试官亲授,备战面试与技能提升,主要考点+主流场景+内功提升+真题解析

image.gif

目录
相关文章
|
23天前
|
前端开发 应用服务中间件 nginx
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
94 0
|
1月前
|
前端开发 应用服务中间件 nginx
使用Docker快速搭建Web服务器Nginx
本文指导如何使用Docker快速搭建Nginx服务器。首先,通过`docker pull`命令获取Nginx镜像,然后以容器形式运行Nginx并映射端口。通过挂载目录实现本地文件与容器共享,便于自定义网页。使用`docker ps`检查运行状态,访问IP:8088确认部署成功。最后,介绍了停止、删除Nginx容器的命令,强调Docker简化了服务器部署和管理。
50 0
|
15天前
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。
|
19天前
|
应用服务中间件 nginx Docker
docker实现Nginx
通过以上步骤,你可以使用Docker来快速搭建并运行Nginx服务器,而且可以根据需要进行自定义配置和持久化数据。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
17 1
|
1月前
|
NoSQL 关系型数据库 MySQL
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
216 0
|
1月前
|
Unix Docker 容器
【超强图解Docker常见命令与实战】
【超强图解Docker常见命令与实战】
51 0
|
1月前
|
负载均衡 应用服务中间件 nginx
|
1月前
|
安全 数据库 开发工具
Django实战:从零到一构建安全高效的Web应用
Django实战:从零到一构建安全高效的Web应用
48 0
|
1月前
|
SQL 机器学习/深度学习 缓存
Go语言Web应用实战与案例分析
【2月更文挑战第21天】本文将通过实战案例的方式,深入探讨Go语言在Web应用开发中的应用。我们将分析一个实际项目的开发过程,展示Go语言在构建高性能、可扩展Web应用方面的优势,并分享在开发过程中遇到的问题和解决方案,为读者提供宝贵的实战经验。
|
1月前
|
前端开发 UED 开发者
构建响应式Web界面:Flexbox与Grid的实战应用
【2月更文挑战第17天】 在现代网页设计中,创建能够适应不同屏幕尺寸的响应式界面是至关重要的。随着移动设备的普及,传统的固定布局已无法满足用户体验的需求。本文将深入探讨CSS中的两种强大的布局模式——Flexbox和Grid,它们如何帮助我们快速实现灵活且高效的响应式设计。通过实例分析,我们将理解这两种技术的工作原理、适用场景以及它们如何相互补充,共同构建出流畅的用户体验。

热门文章

最新文章