- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Ubuntu安装方式
-
在线方式
sudo apt-get install nginx
-
源码方式
安装依赖
# 安装gcc g++ sudo apt-get install build-essential sudo apt-get install libtool # 安装pcre依赖库(http://www.pcre.org/) sudo apt-get update sudo apt-get install libpcre3 libpcre3-dev # 安装zlib依赖库(http://www.zlib.net) sudo apt-get install zlib1g-dev # 安装SSL依赖库(16.04默认已经安装了) sudo apt-get install openssl
下载源码启动:
# 下载最新版本: # 下面的version可以改为对应的版本 # http://nginx.org/download/nginx-1.17.0.tar.gz wget -O /tmp/nginx.tar.gz http://nginx.org/download/nginx-<version>.tar.gz # 解压: cd /tmp/ tar -zxvf nginx.tar.gz # 进入解压目录: cd nginx-1.13.6 # 配置: ./configure --prefix=/usr/local/nginx # 编译: make # 安装: sudo make install # 启动: #注意:-c 指定配置文件的路径,不加的话,nginx会自动加载默认路径的配置文件,可以通过-h查看帮助命令。 #查看进程: sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # 查看进程启动状态 ps -ef | grep nginx
Nginx配置及优化
- 配置文件结构
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块--start
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块--end
}
- 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- location块:配置请求的路由,以及各种页面的处理情况。
-
配置优化
配置文件:
user www-data; pid /run/nginx.pid; # worker_processes用来设置Nginx服务的进程数。推荐是CPU内核数或者内核数的倍数,推荐使用CPU内核数 worker_processes 4; # 默认情况下,Nginx的多个进程有可能跑在某一个CPU或CPU的某一核上,导致Nginx进程使用硬件的资源不均 worker_cpu_affinity 0001 0010 0100 1000; # 设置一个进程理论允许的最大连接数,理论上越大越好,但不可以超过worker_rlimit_nofile的值 worker_rlimit_nofile 65535; events { # 设置事件驱动模型,是内核2.6以上支持 use epoll; worker_connections 65535; accept_mutex off; multi_accept off; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 60 50; send_timeout 10s; types_hash_max_size 2048; client_header_buffer_size 4k; client_max_body_size 8m; include /etc/nginx/mime.types; default_type application/octet-stream; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; gzip_disable "msie6"; gzip_min_length 1024; gzip_vary on; gzip_comp_level 2; gzip_buffers 32 4k; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
nginxs配置说明:
worker_connections
设置一个进程理论允许的最大连接数,理论上越大越好,但不可以超过worker_rlimit_nofile的值。还有个问题,linux系统中有个指令open file resource limit,它设置了进程可以打开的文件句柄数量,可以用下面的指令查看你的linux系统中open file resource limit指令的值,cat /proc/sys/fs/file-max
可以将该指令设置为23900251
echo "2390251" > /proc/sys/fs/file-max
sysctl -p
-
压测工具Apache ab
我们要测试 nginx 的负载能力,需要借助压力测试工具。本博客是使用 Apache 服务器自带的一个 web 压力测试工具 ApacheBench ,简称 ab。ab 是一个命令行工具,即通过
ab
命令行,模拟多个请求同时对某一 URL 地址进行访问,因此可以用来测试目标服务器的负载压力。yum -y install httpd-tools # 查看安装结果 ab -V # 简单的使用 # -c:一次并发请求的数量;-n:请求总次数 ab -c 5000 -n 200000 http://10.211.55.6:80/index.html
-
其他优化
net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 # 开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 # timewait的数量,默认是180000 net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.tcp_sack = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_rmem = 4096 87380 4194304 net.ipv4.tcp_wmem = 4096 16384 4194304 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 # # 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。 net.core.netdev_max_backlog = 262144 # web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义 的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值 net.core.somaxconn = 262144 # 系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅 是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。 net.ipv4.tcp_max_orphans = 3276800 # 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。 net.ipv4.tcp_max_syn_backlog = 262144 # 时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。 net.ipv4.tcp_timestamps = 0 # 为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。 net.ipv4.tcp_synack_retries = 1 # 在内核放弃建立连接之前发送SYN包的数量。 net.ipv4.tcp_syn_retries = 1 # 启用timewait快速回收 net.ipv4.tcp_tw_recycle = 1 # 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 94500000 915000000 927000000 # 如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。 2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。 net.ipv4.tcp_fin_timeout = 1 # 当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时 net.ipv4.tcp_keepalive_time = 30 # 允许系统打开的端口范围 net.ipv4.ip_local_port_range = 1024 65000