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已经正常启动了:



Welcome to nginx!



Welcome to nginx!


If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.




For online documentation and support please refer to
nginx.org.

Commercial support is available at
nginx.com.




Thank you for using nginx.






最后,为了能够充分发挥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              #端口范围

………………………………………………………………………………………………………………………………………………

下载附录:NGINX各个版本: http://down.51cto.com/data/2369729 

       NGINX YUM源:  http://down.51cto.com/data/2387451