Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx 可以在大多数 UnixLinux OS 上编译运行,并有 Windows 移植版。 Nginx 的1.4.0稳定版已经于2013年4月24日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。
Nginx 的源代码使用 2-clause BSD-like license。
Nginx 是一个很强大的高性能Web和反向代理服务,它具有很多非常优越的特性:
在连接高并发的情况下,Nginx是Apache服务不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。
-
默认情况 Centos 的 yum 和 epel 源里没有 Nginx,可以使用 Nginx 官网提供的源地址:http://nginx.org/packages/
-
详细操作请参照拙作:https://blog.csdn.net/gaofei0428/article/details/102903468
- 安装 Nginx yum 源
- rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
- 查看 /etc/yum.repos.d/nginx.repo 确保 enabled=1 为启用
- 使用 yum 安装 Nginx
-
编辑 vim /etc/nginx/conf.d/default.conf 配置文件
- 这里要注意以下几点:
- user nginx #这里的用户要跟后面要使用的 PHP 设置的 user 一致
- 去掉 location ~ \.php$ 段的注释,使 Nginx 支持 PHP
- location ~ \.php$ {
root /usr/share/nginx/html; #要使用绝对路径,注意目录的属主属组
fastcgi_pass 127.0.0.1:9000; #这里的设置要跟 PHP 配置文件中的一致
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #要把 /scripts
改为 $document_root
注意没有
/
include fastcgi_params;
}
-
修改目录属主属组
- 暂时不启动 Nginx,先安装 PHP 7,要使用 yum epel 以及 remi 源
-
具体设置请参见拙作:https://blog.csdn.net/gaofei0428/article/details/102903468
-
rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
-
yum install -y --enablerepo=remi --enablerepo=remi-php74 php php-fpm php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof php-bcmath php-gd php-common --skip-broken
-
编辑 vim /etc/php-fpm.d/www.conf 配置文件
- user = nginx #这里的 user 要跟 Nginx 配置文件 /etc/nginx/conf.d/default.conf 中设置的 user 一致
group = nginx
- 这里的 listen 选项值要跟 Nginx 配置文件 /etc/nginx/conf.d/default.conf 中的 fastcgi_pass 127.0.0.1:9000; 一致
- listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1 - PS:要么使用统一的 IP ,要么使用统一的 域名
- 确认无误保存退出,启动 Nginx 和 PHP
- 编辑 vim /usr/share/nginx/html/test.php
- 打开浏览器 输入 IP 查看
Nginx 性能优化
- Nginx 运行工作进程个数一般设置CPU的核心或者核心数x2
- 查看 cpu 核心数
- grep ^processor /proc/cpuinfo | wc -l
- 编辑 /etc/nginx/nginx.conf
user nginx; #指定Nginx用户,注意字段后面的 分号 ;
worker_processes auto; #指定Nginx启动的工作进程的数量,这里设置为 auto 根据需求自动调整
worker_rlimit_nofile 65535; #配置nginx工作进程最大打开文件数
error_log /var/log/nginx/error.log warn; #指定错误日志名称及存放位置
pid /var/run/nginx.pid;
events {
worker_connections 65535; #配置单个工作进程的最大连接数
use epoll; #选择事件驱动模型,Nginx支持众多的事件驱动,比如select、poll、epoll,只能设置在events模块中
multi_accept on; #打开同时接受多个新网络连接请求的功能。
accept_mutex on; #优化同一时刻只有一个请求而避免多个睡眠进程被唤醒的设置,on为防止被同时唤醒
}
http {
include /etc/nginx/mime.types; #定义MIME-Type,Nginx作为Web服务器必须要能够识别全都请求的资源类型
default_type application/octet-stream;
log_format logstash_json '{"@timestamp":"$time_iso8601",' #自定义访问日志,将日志定义为json格式
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"url":"$uri",'
'"domain":"$host",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"agent":"$http_user_agent",'
'"status":"$status"}';
access_log /var/log/nginx/samsung1.access.log logstash_json; #定义访问日志文件存放位置
sendfile on; #配置允许sendfile方式传输文件
sendfile_max_chunk 512k; #用sendfile()传输的数据最大不能超出这个值,默认值为0表示无限制
tcp_nopush on; #使用TCP_CORK套接字,该选项仅在使用sendfile的时候才开启
keepalive_timeout 60; #客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接
tcp_nodelay on; #开启 Nagle算法,降低网络里小包的数量,从而提升网络性能,只在keep-alive启作用
client_header_buffer_size 4k; #客户端请求头部的缓冲区大小
open_file_cache max=102400 inactive=20s; #打开文件指定缓存,默认是没有启用的,max指定缓存数量
open_file_cache_valid 30s; #指定多长时间检查一次缓存的有效信息
open_file_cache_min_uses 1; #open_file_cache指令中的inactive 参数时间内文件的最少使用次数
client_header_timeout 15; #设置请求头的超时时间
client_body_timeout 15; #设置请求体的超时时间
reset_timedout_connection on; #告诉nginx关闭不响应的客户端连接
send_timeout 15; #响应客户端超时时间
server_tokens off; #隐藏 Ngxin 版本号
client_max_body_size 10m; #上传文件大小限制
gzip on; #开启 gzip
gzip_min_length 2k; #设置允许压缩的页面最小字节数,建议设置成大于1K,如果小与1K可能会越压越大
gzip_buffers 4 32k; #压缩缓冲区大小,表示申请4个单位为32K的内存作为压缩结果流缓存
gzip_http_version 1.1; #压缩版本,用于设置识别HTTP协议版本,默认是1.1
gzip_comp_level 6; #用来指定GZIP压缩比,1压缩比最小处理速度最快,9压缩比最大传输速度快但是处理慢,也比较消耗CPU资源
gzip_vary on; #开启varyheader支持,可以让前端的缓存服务器缓存经过GZIP压缩的页面
gzip_proxied any; #Nginx做为反向代理的时候启用,any – 无条件压缩所有结果数据
include /etc/nginx/conf.d/*.conf;
} #注意前后的 大括号 {}
-
编辑 /etc/nginx/conf.d/default.conf 设置 expires 缓存调优
-
vim /etc/nginx/conf.d/default.conf
-
主要针对于图片,css,js等元素更改机会比较少的情况下使用,特别是图片,占用带宽大,可以设置图片在浏览器本地缓存365d,css,js,html可以缓存个10来天,第一次打开加载慢一点,第二次,就非常快了!缓存的时候,将需要缓存的拓展名列出来, Expires缓存配置在 server 字段里面。
-
location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
expires 30d;
#log_not_found off;
access_log off;
}location ~* \.(js|css)$ {
expires 7d;
log_not_found off;
access_log off;
} - Nginx 防盗链
location ~*^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers noneblocked http://192.168.10.2/*;
if ($invalid_referer) {
return 404;
break;
}
access_log off;
}
-
Linux 系统内核参数优化
- 编辑 vim /etc/sysctl.conf
-
fs.file-max = 999999:这个参数表示进程(比如一个worker进程)可以同时打开的最大句柄数,这个参数直线限制最大并发连接数,需根据实际情况配置。
-
net.ipv4.tcp_max_tw_buckets = 6000 :这个参数表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。注:主动关闭连接的服务端会产生TIME_WAIT状态的连接
-
net.ipv4.ip_local_port_range = 1024 65000 :允许系统打开的端口范围。
-
net.ipv4.tcp_tw_recycle = 1 :启用timewait快速回收。
-
net.ipv4.tcp_tw_reuse = 1 :开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。这对于服务器来说很有意义,因为服务器上总会有大量TIME-WAIT状态的连接。
-
net.ipv4.tcp_keepalive_time = 30:这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置的小一些,可以更快地清理无效的连接。
-
net.ipv4.tcp_syncookies = 1 :开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。
-
net.core.somaxconn = 40960 :web 应用中 listen 函数的 backlog 默认会给我们内核参数的。
-
net.core.somaxconn :限制到128,而nginx定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值。注:对于一个TCP连接,Server与Client需要通过三次握手来建立网络连接.当三次握手成功后,我们可以看到端口的状态由LISTEN转变为ESTABLISHED,接着这条链路上就可以开始传送数据了.每一个处于监听(Listen)状态的端口,都有自己的监听队列.监听队列的长度与如somaxconn参数和使用该端口的程序中listen()函数有关。somaxconn定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128,对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。
-
net.core.netdev_max_backlog = 262144 :每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
-
net.ipv4.tcp_max_syn_backlog = 262144 :这个参数标示TCP三次握手建立阶段接受SYN请求队列的最大长度,默认为1024,将其设置得大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的连接请求。
-
net.ipv4.tcp_rmem = 10240 87380 12582912 :这个参数定义了TCP接受缓存(用于TCP接受滑动窗口)的最小值、默认值、最大值。
-
net.ipv4.tcp_wmem = 10240 87380 12582912:这个参数定义了TCP发送缓存(用于TCP发送滑动窗口)的最小值、默认值、最大值。
-
net.core.rmem_default = 6291456:这个参数表示内核套接字接受缓存区默认的大小。
-
net.core.wmem_default = 6291456:这个参数表示内核套接字发送缓存区默认的大小。
-
net.core.rmem_max = 12582912:这个参数表示内核套接字接受缓存区的最大大小。
-
net.core.wmem_max = 12582912:这个参数表示内核套接字发送缓存区的最大大小。
-
net.ipv4.tcp_syncookies = 1:该参数与性能无关,用于解决TCP的SYN攻击。、
-
系统连接数的优化
- Linux 默认值 open files为1024
-
编辑 /etc/security/limits.conf 在末尾添加,保存完需要重新登录生效: su - (另外 SSH 需要 开启 UsePAM)
* soft nofile 65535
* hard nofile 65535
* soft noproc 65535
* hard noproc 65535