Nginx是一个高性能的Web和反向代理服务器,它具有很多非常优越的特性:
● 作为Web服务器:相比Apache,Nginx使用更少的资源,支持更多的并发连接,体现更高的效率,这点使Nginx尤其受到虚拟主机提供商的欢迎。一个Nginx实例能够轻松支持高达50000个并发连接数的响应。
● 作为负载均衡服务器:Nginx既可以在内部直接支持Rails和PHP,也可以支持作为HTTP代理服务器对外进行服务。Nginx用C编写,不论是系统资源开销还是CPU使用效率都比Perbal要好得多。
● 作为邮件代理服务器:Nginx同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm描述了成功并且美妙的使用经验。
● Nginx安装非常方便,配置文件非常简洁(还能够支持Perl语法),Bug非常少。Nginx启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下进行软件版本的升级。
本节将首先介绍Nginx官方发行版本的镜像生成,然后介绍在国外应用量众多的Nginx淘宝增强版—Tengine镜像的生成。
Nginx官方版本
由于使用Dockerfile生成镜像的步骤大多类似。为了节约篇幅,这里直接介绍使用的Dockerfile文件和需要的脚本文件,如果读者对使用Dockerfile创建镜像的步骤还有不清楚的地方,可以查看第一部分中关于Dockerfile的介绍章节和上一节Apache镜像的创建过程。
[root@docker1 ~]# mkdir nginx_centos && cd nginx_centos
[root@docker1 nginx_centos]# touch Dockerfile run.sh
① Nginx Dockerfile
[root@docker1 nginx_centos]# cat Dockerfile
#设置继承docker.io/centos:latest镜像
FROM docker.io/centos:latest
#下面是一些创建者的基本信息
MAINTAINER from dockerpool.com by waitfish
#设置环境变量,所有操作都是非交互式的
ENV DEBIAN_FRONTEND noninteractive
RUN echo "Asia/Shanghai" > /etc/timezone #&& \
# dpkg-reconfigure -f noninteractive tzdata #这也是设置时区的
#注意这里要更改系统的时区设置,因为在Web应用中经常会用到时区这个系统变量,默认的centos会让你的应用此程序发生不可思议的效果哦
#需要使用yum需要执行这一步
RUN yum update
RUN yum install wget -y
RUN wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN yum repolist
RUN rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
#################################################################################
#安装sshd服务
RUN yum install -y openssh-server
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
#取消pam限制
RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd
###################################################################################
#安装nginx,设置nginx以非daemon启动
RUN \
yum install -y nginx && \
echo "daemon off;" >> /etc/nginx/nginx.conf #&& \
#chown -R www-data:www-data /var/lib/nginx
#添加我们的脚本,并设置权限,这会覆盖之前放在这个位置的脚本
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#定义可以被挂载的目录,分别是虚拟主机的挂载目录、证书目录、配置目录和日志目录
VOLUME ["/etc/nginx/sites-enabled","/etc/nginx/certs","/etc/nginx/conf.d","/var/log/nginx"]
#定义工作目录
WORKDIR /etc/nginx
#定义输出端口
EXPOSE 80
EXPOSE 443
EXPOSE 22
#设置自启动命令
CMD ["/run.sh"]
② 查看run.sh脚本文件内容
[root@docker1 nginx_centos]# cat run.sh
#!/bin/bash
/usr/sbin/sshd &
/usr/sbin/nginx
③ 在宿主主机上生成SSH密钥对,并创建authorized_keys文件:
# ssh-keygen -t rsa
….
# cat ~/.ssh/id_rsa.pub >authorized_keys
或[root@docker1 ~]# cp /root/.ssh/id_rsa.pub /root/sshd_centos/authorized_keys
[root@docker1 nginx_centos]# cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRlvK19B32F3cDKZnAhmizuKJotVhBeZdmGDJ6TGFyiRLEgiPPTiUEvUq9nLZqkGM/U0u6kZn8vFajThOFKyT2I/WTP3Ix3h1vHlre1U3c75FeRrRgkfYC4SVnvCVMjl7mtqNEfnfTuQQckvL/5moVymbpdqnBdNfiSBvw2e73iE+hQWs0YUOnFwOVdM1LCBFidqaP84gLRoDOtcG3ya68z3I0xKEIapW/TEsPmVOS3Xnf9SJS3QfB5sKUKA5DHVIeJaEEZB7uzaFQOmVhcguXmqtsgxciOeFhUpWm5tE+0tw/dygGLKOHD6K8s6/k7oSUZwGHZ/NnGB3npP698JrJ root@docker1
[root@docker1 nginx_centos]# ls
authorized_keys Dockerfile run.sh
④ 使用docker build命令,创建镜像nginx:centos:
[root@docker1 nginx_centos]# docker build -t nginx:centos .
⑤ 测试:
启动容器,查看内部的80端口被映射到本地的32818端口:
[root@docker1 nginx_centos]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9ef224c25678 sshd:nginx "/run.sh" About an hour ago Up About an hour 0.0.0.0:32819->22/tcp, 0.0.0.0:32818->80/tcp, 0.0.0.0:32817->443/tcp pedantic_engelbart
访问本地的32828端口:
[root@docker1 nginx_centos]# curl 127.0.0.1:32818
返回Nginx的欢迎页面,说明Nginx已经正常启动了:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
最后,为了能够充分发挥Nginx的性能,可对系统内核参数做一些调整:
下面是一份常见的Nginx内核的优化参数:
1. net.ipv4.ip_forward = 0
2. net.ipv4.conf.default.rp_filter =1
3. net.ipv4.conf.default.accept_source_route = 0
4. kernel.sysrq = 0
5. kernel.core_uses_pid = 1
6. net.ipv4.tcp_syncookies = 1
7. kernel.msgmnb = 65536
8. kernel.msgmax = 65536
9. kernel.shmmax = 68719476736
10. kernel.shmall = 4294967296
11. net.ipv4.tcp_max_tw_buckets = 6000 #timewait的数量
12. net.ipv4.tcp_sack = 1 #有选择的应答
13. net.ipv4.tcp_window_scaling = 1 #设置tcp/ip会话滑动窗口是否可变,1可变,0不可变。开启使滑动窗口大小增加数个数量级,提高数据传输能力
14. net.ipv4.tcp_rmem = 4096 87380 4194304 #tcp接收缓冲区
15. net.ipv4.tcp_wmem = 4096 16384 4194304 #tcp发送缓冲区
16. net.core.wmem_default = 8388608 #发送套接字缓冲区大小的缺省值(字节单位)
17. net.core.rmem_default = 8388608 #接收套接字缓冲区大小的缺省值
18. net.core.rmem_max = 16777216 #接收套接字缓冲区大小的最大值
19. net.core.wmem_max = 16777216 #发送套接字缓冲区大小的最大值
20. net.core.netdev_max_backlog = 262144 #允许送到队列的数据包最大数目
21. net.core.somaxconn = 262144 #web应用中listen函数的backlog(积压)
22. net.ipv4.tcp_max_orphans = 3276800 #最多有多少个TCP套接字不被关联到任何一个用户的句柄上
23. net.ipv4.tcp_max_syn_backlog = 262144 #记录那些尚未收到客户端确认信息的连接请求最大值,表示SYN队列的长度,可以容纳更多等待连接的网络连接数
24. net.ipv4.tcp_timestamps = 0 #时间戳关闭
25. net.ipv4.tcp_synack_retries = 1 #这个设置决定了内核放弃连接之前发送SYN+ACK包的数量
26. net.ipv4.tcp_syn_retries = 1 #内核放弃连接之前发送SYN包的数量
27. net.ipv4.tcp_tw_recycle = 1 #timewait快速回收
28. net.ipv4.tcp_tw_reuse = 1 #timewait 用于新的连接
29. net.ipv4.tcp_mem = 94500000 915000000 927000000 #out of socket memory
30. net.ipv4.tcp_fin_timeout = 1 #保持在FIN-WAIT-2状态的时间,对端出错永不关闭甚至当机缺省值是60s
31. net.ipv4.tcp_keepalive_time = 30 #keepalived 发送消息的频度
32. net.ipv4.ip_local_port_range = 1024 65000 #端口范围
………………………………………………………………………………………………………………………………………………
本文转自 Mr_sheng 51CTO博客,原文链接:http://blog.51cto.com/sf1314/2044809
原文链接:https://blog.csdn.net/weixin_34216036/article/details/89830459