1.简介

Nginx(发音“engine -x”)是一款功能强大的开源反向代理服务器,支持HTTP、HTTPS、SMTP、POP3、IMAP等协议。它可以作为负载均衡器、HTTP缓存或Web服务器。Nginx一开始就专注于高并发和高性能的应用场景。它使用类BSD开源协议,支持Linux、BSD、Mac、Solaris、AIX等Unix系统,同时也有Windows上的移植版本。

2.特性

  • 热部署:采用master管理进程与worker工作进程的分离设计,支持热部署。在不间断服务的前提下,可以直接升级版本。也可以在不停止服务的情况下修改配置文件,更换日志文件等。
  • 高并发连接:Nginx可以轻松支持超过100K的并发,理论上支持的并发连接上限取决于机器内存。
  • 低内存消耗:在一般请款下,10K个非活跃的HTTP Keep-Alive连接在Nginx中仅消耗2.5MB的内存,这也是Nginx支持高并发连接的基础。
  • 响应快:在正常的情况下,单次请求会得到更快的响应。在高峰期,Nginx可以比其他的Web服务器更快的响应请求。
  • 高可靠性:Nginx是一个高可靠性的Web服务器,这也是用户为什么选择Nginx的基本条件,现在很多的网站都使用Nginx,足以说明Nginx的可靠性。高可用性来自其核心框架代码的优秀设计和实现。

3.自定义镜像

3.1Dockerfile

FROM sshd:dockerfile

#创建者的基本信息

#安装nginx,设置nginx以非daemon启动
RUN apt-get install -y nginx && rm -rf /var/lib/apt/lists/*
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf && chown -R www-data:www-data /var/lib/nginx
RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
#注意这里要更改系统的时区,因为在web应用中会常用到时区这个系统变量,默认的ubuntu会让你的应用程序发送不可思议的效果

#添加我们的脚本,并设置权限,这回覆盖之前放在这个位置的脚本
ADD run.sh /run.sh
RUN chmod 755 /*.sh

#定义可以被挂载的目录,分别是虚拟主机的挂载目录,证书目录,配置目录和日志目录
VOLUME ["/etc/nginx/sites-enabled","/etc/nginx/certs","/etc/nginx/conf.d","/var/log/nginx"]

#定义工作目录
WORKDIR /etc/nginx

#定义输出命令
CMD ["/run.sh"]

#定义输出端口
EXPOSE 80
EXPOSE 443

2.run.sh

#!/bin/bash
/usr/sbin/sshd &
/usr/sbin/nginx

3.创建镜像

docker build -t nginx:stable .

4.测试

启动容器,查看内部的80端口被映射到本地的32790端口

$ docker run -d -P nginx:stable
2fa38c305e76d670636cf78b4c61f197fdee40fdfa3012de4d783506a5a19416
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                  NAMES
2fa38c305e76        nginx:stable        "/run.sh"                6 seconds ago       Up 5 seconds        0.0.0.0:32791->22/tcp, 0.0.0.0:32790->80/tcp, 0.0.0.0:32789->443/tcp   hardcore_northcutt

访问本地的32970端口:

$ curl 127.0.0.1:32790

宿主机中的nginx 和 docker 中的nginx 有区别吗 docker和nginx部署优缺点_nginx


ssh进入容器:

$ ssh 10.0.0.45 -p 32791
The authenticity of host '[10.0.0.45]:32791 ([10.0.0.45]:32791)' can't be established.
ECDSA key fingerprint is SHA256:NK9SQV0RKFQonhHxl+EObrP9GxsJKcRt6rdmScR7wJk.
ECDSA key fingerprint is MD5:df:67:65:27:f5:3a:d6:96:f2:b0:46:93:16:ff:ff:a8.
Are you sure you want to continue connecting (yes/no)? yes

root@2fa38c305e76:~# ls
root@2fa38c305e76:~# top
top - 11:37:43 up 2 days, 28 min,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:   8 total,   1 running,   7 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   6009.9 total,   2486.1 free,    541.0 used,   2982.8 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   5155.6 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
     1 root      20   0    3968   1492   1260 S   0.0   0.0   0:00.01 run.sh
     7 root      20   0   57304   5916   4548 S   0.0   0.1   0:00.02 nginx
     8 root      20   0   12152   1700    780 S   0.0   0.0   0:00.00 sshd
     9 www-data  20   0   57860   3060   1280 S   0.0   0.0   0:00.00 nginx
    10 www-data  20   0   57860   2820   1068 S   0.0   0.0   0:00.00 nginx
    17 root      20   0   13524   5340   3932 S   0.0   0.1   0:00.02 sshd
    29 root      20   0    5984   2380   1800 S   0.0   0.0   0:00.00 bash
    36 root      20   0    7828   1900   1396 R   0.0   0.0   0:00.00 top

4.参数优化

net.ipv4.ip_forward = 0
#关闭ip转发

net.ipv4.conf.default.rp_filter = 1
#rp_filter 本身会过滤反向路由不通的数据包 
#参考https://zhuanlan.zhihu.com/p/129784373

net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1   
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量的SYN ×××,默认为0,表示关闭。

kernel.ms-nb = 65536
kernel.ms-ax = 65535
kernel.shmmax = 68719476736
kernel,shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1

net.ipv4.tcp_window_scaing =1
#支持超过64KB的TCP窗口  

net.ipv4.tcp_rmem = 4096 87380 4194304
#为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下tcp socket都至少会有这么多的数量的内存用于接收缓冲,默认值为8K。

net.ipv4.tcp_wmem = 4096 16384 4194304
#为TCP socket预留用于发送缓冲的内存数量,每个tcp socket都可以在建议以后都可以使用它。默认值为6K

未完待续。。。。
即将做一个专栏 稍后 贴链接