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
#创建者的基本信息
MAINTAINER https://blog.csdn.net/weixin_46380571
#安装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
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
未完待续。。。。
即将做一个专栏 稍后 贴链接