将VUE项目部署到ECS服务器上
ECS使用体验1、个人介绍我是一名大二的学生,近期实验室开发了实验室管理系统,老师让我做一个介绍系统的首页,首页做好了又让搞部署,方便用域名来访问,说参加比赛更有底气,我现在大二,年轻气盛,之前从来没有部署过,想着也不是什么难事,结果要租服务器,服务器需要资金,我还没参加比赛就要先投资了,正好看见了阿里云这个开发者计划,深得我心,于是便完成了任务免费领了一个。2、项目部署本次项目是一个vue项目,部署方式采用build打包成静态资源,然后使用nginx。2.1 nginx安装#需要安装前置依赖,一键安装所有的前置依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
[root@iZ0jl0ffkpvo74x04pmneoZ local]# tar -zxvf nginx-1.18.0.tar.gz
#注意,解压之后不要把nginx-1.18.0的名字改为nginx,因为在配置nginx之后,会自动生成一个nginx文件夹,避免重名
[root@iZ0jl0ffkpvo74x04pmneoZ local]# cd nginx-1.18.0
[root@iZ0jl0ffkpvo74x04pmneoZ nginx-1.18.0]# ./configure
[root@iZ0jl0ffkpvo74x04pmneoZ nginx-1.18.0]# make
[root@iZ0jl0ffkpvo74x04pmneoZ nginx-1.18.0]# make install
#返回上一级,已经多出了一个nginx文件夹
#进入nginx目录
[root@centos7 nginx]# ls
conf html logs sbin
[root@iZ0jl0ffkpvo74x04pmneoZ nginx]# cd sbin
[root@iZ0jl0ffkpvo74x04pmneoZ sbin]# ls
nginx2.2 nginx基本命令常用命令在sbin目录下执行相应的nginx命令即可启动[root@iZ0jl0ffkpvo74x04pmneoZ sbin]# ./nginx退出./nginx -s quit停止./nginx -s stop重启./nginx -s reload查看配置文件所在的目录./nginx -t查看版本信息./nginx -v #查看帮助信息 ./nginx -h查看运行状态ps -ef | grep nginx#查看nginx进程 cat nginx.pid2.3 配置文件http模块的命令alias 别名 设置别名keepalive_timeout [time] 设置超时连接时间,默认时间75s,time单位为秒resolver_timeout [time] 解析超时时间,默认值为30sserver模块命令server_name 服务器名称 设置服务器名称listen 端口号 设置监听的端口号charset 字符集 设置字符集设置访问路径2.4 将本地项目build打包使用 npm run build 命令打包vue项目,会在dist文件中生成相关的资源,最后将dist文件夹发到服务器上,然后再把nginx的配置文件中root后面设置服务器中dist的文件路径即可。3.访问在ECS控制台中找到安全组,开方对应的nginx端口号即可
将VUE项目部署到ECS服务器上
ECS使用体验1、个人介绍我是一名大二的学生,近期实验室开发了实验室管理系统,老师让我做一个介绍系统的首页,首页做好了又让搞部署,方便用域名来访问,说参加比赛更有底气,我现在大二,年轻气盛,之前从来没有部署过,想着也不是什么难事,结果要租服务器,服务器需要资金,我还没参加比赛就要先投资了,正好看见了阿里云这个开发者计划,深得我心,于是便完成了任务免费领了一个。2、项目部署本次项目是一个vue项目,部署方式采用build打包成静态资源,然后使用nginx。2.1 nginx安装#需要安装前置依赖,一键安装所有的前置依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
[root@iZ0jl0ffkpvo74x04pmneoZ local]# tar -zxvf nginx-1.18.0.tar.gz
#注意,解压之后不要把nginx-1.18.0的名字改为nginx,因为在配置nginx之后,会自动生成一个nginx文件夹,避免重名
[root@iZ0jl0ffkpvo74x04pmneoZ local]# cd nginx-1.18.0
[root@iZ0jl0ffkpvo74x04pmneoZ nginx-1.18.0]# ./configure
[root@iZ0jl0ffkpvo74x04pmneoZ nginx-1.18.0]# make
[root@iZ0jl0ffkpvo74x04pmneoZ nginx-1.18.0]# make install
#返回上一级,已经多出了一个nginx文件夹
#进入nginx目录
[root@centos7 nginx]# ls
conf html logs sbin
[root@iZ0jl0ffkpvo74x04pmneoZ nginx]# cd sbin
[root@iZ0jl0ffkpvo74x04pmneoZ sbin]# ls
nginx2.2 nginx基本命令
#常用命令
#在sbin目录下执行相应的nginx命令即可
#启动
[root@iZ0jl0ffkpvo74x04pmneoZ sbin]# ./nginx
#退出
./nginx -s quit
#停止
./nginx -s stop
#重启
./nginx -s reload
#查看配置文件所在的目录
./nginx -t
#查看版本信息
./nginx -v
#查看帮助信息
./nginx -h
#查看运行状态
ps -ef | grep nginx
#查看nginx进程
cat nginx.pid2.3 配置文件http模块的命令alias 别名 设置别名
keepalive_timeout [time] 设置超时连接时间,默认时间75s,time单位为秒
resolver_timeout [time] 解析超时时间,默认值为30sserver模块命令server_name 服务器名称 设置服务器名称
listen 端口号 设置监听的端口号
charset 字符集 设置字符集设置访问路径2.4 将本地项目build打包使用 npm run build 命令打包vue项目,会在dist文件中生成相关的资源,最后将dist文件夹发到服务器上,然后再把nginx的配置文件中root后面设置服务器中dist的文件路径即可。3.访问在ECS控制台中找到安全组,开方对应的nginx端口号即可
nginx 出现504 Gateway Time-out的解决方法
1.问题分析
nginx访问出现504 Gateway Time-out,一般是由于程序执行时间过长导致响应超时,例如程序需要执行90秒,而nginx最大响应等待时间为30秒,这样就会出现超时。
通常有以下几种情况导致
1.程序在处理大量数据,导致等待超时。
2.程序中调用外部请求,而外部请求响应超时。
3.连接数据库失败而没有停止,死循环重新连。
出现这种情况,我们可以先优化程序,缩短执行时间。另一方面,可以调大nginx超时限制的参数,使程序可以正常执行。
对于访问超时的设定,nginx与php都有相关的设置,可以逐一进行修改。
2.解决方法
nginx配置
nginx.conf中,设置以下几个参数,增加超时时间
fastcgi_connect_timeout
fastcgi连接超时时间,默认60秒
fastcgi_send_timeout
nginx 进程向 fastcgi 进程发送请求过程的超时时间,默认值60秒
fastcgi_read_timeout
fastcgi 进程向 nginx 进程发送输出过程的超时时间,默认值60秒
php配置
php.ini
max_execution_time
php脚本最大执行时间
php-fpm
request_terminate_timeout
设置单个请求的超时时间
php程序中可加入set_time_limit(seconds)设置最长执行时间
例如 set_time_limit(0) 表示不超时。
Nginx 战斗准备:优化指南
Nginx 战斗准备:优化指南
大多数的Nginx安装指南告诉你如下基础知识——通过apt-get安装,修改这里或那里的几行配置,好了,你已经有了一个Web服务器了!而且,在大多数情况下,一个常规安装的nginx对你的网站来说已经能很好地工作了。然而,如果你真的想挤压出nginx的性能,你必须更深入一些。在本指南中,我将解释Nginx的那些设置可以微调,以优化处理大量客户端时的性能。需要注意一点,这不是一个全面的微调指南。这是一个简单的预览——那些可以通过微调来提高性能设置的概述。你的情况可能不同。
基本的 (优化过的)配置
我们将修改的唯一文件是nginx.conf,其中包含Nginx不同模块的所有设置。你应该能够在服务器的/etc/nginx目录中找到nginx.conf。首先,我们将谈论一些全局设置,然后按文件中的模块挨个来,谈一下哪些设置能够让你在大量客户端访问时拥有良好的性能,为什么它们会提高性能。本文的结尾有一个完整的配置文件。
高层的配置
nginx.conf文件中,Nginx中有少数的几个高级配置在模块部分之上。
user www-data;
pid /var/run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 100000;
user和pid应该按默认设置 - 我们不会更改这些内容,因为更改与否没有什么不同。
worker_processes 定义了nginx对外提供web服务时的worder进程数。最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式。不能确定的时候,将其设置为可用的CPU内核数将是一个好的开始(设置为“auto”将尝试自动检测它)。
worker_rlimit_nofile 更改worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有“too many open files”问题了。
Events模块
events模块中包含nginx中所有处理连接的设置。
events {
worker_connections 2048;
multi_accept on;
use epoll;
}
worker_connections设置可由一个worker进程同时打开的最大连接数。如果设置了上面提到的worker_rlimit_nofile,我们可以将这个值设得很高。
记住,最大客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处。
multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接。
use 设置用于复用客户端线程的轮询方法。如果你使用Linux 2.6+,你应该使用epoll。如果你使用*BSD,你应该使用kqueue。想知道更多有关事件轮询?看下维基百科吧(注意,想了解一切的话可能需要neckbeard和操作系统的课程基础)
(值得注意的是如果你不知道Nginx该使用哪种轮询方法的话,它会选择一个最适合你操作系统的)。
HTTP 模块
HTTP模块控制着nginx http处理的所有核心特性。因为这里只有很少的配置,所以我们只节选配置的一小部分。所有这些设置都应该在http模块中,甚至你不会特别的注意到这段设置。
http {
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}
server_tokens 并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。
sendfile可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile)
tcp_nopush 告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送
tcp_nodelay 告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。
access_log off;
error_log /var/log/nginx/error.log crit;
access_log设置nginx是否将存储访问日志。关闭这个选项可以让读取磁盘IO操作更快(aka,YOLO)。
error_log 告诉nginx只能记录严重的错误。
keepalive_timeout 10;
client_header_timeout 10;
client_body_timeout 10;
reset_timedout_connection on;
send_timeout 10;
keepalive_timeout 给客户端分配keep-alive链接超时时间。服务器将在这个超时时间过后关闭链接。我们将它设置低些可以让ngnix持续工作的时间更长。
client_header_timeout 和client_body_timeout 设置请求头和请求体(各自)的超时时间。我们也可以把这个设置低些。
reset_timeout_connection告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。
send_timeout 指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx就会关闭连接。
limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 100;
limit_conn为给定的key设置最大连接数。这里key是addr,我们设置的值是100,也就是说我们允许每一个IP地址最多同时打开有100个连接。
limit_conn_zone设置用于保存各种key(比如当前连接数)的共享内存的参数。5m就是5兆字节,这个值应该被设置的足够大以存储(32K*5)32byte状态或者(16K*5)64byte状态。
include /etc/nginx/mime.types;
default_type text/html;
charset UTF-8;
include只是一个在当前文件中包含另一个文件内容的指令。这里我们使用它来加载稍后会用到的一系列的MIME类型。
default_type设置文件使用的默认的MIME-type。
charset设置我们的头文件中的默认的字符集。
以下两点对于性能的提升在伟大的WebMasters StackExchange中有解释。
gzip on;
gzip_disable "msie6";
# gzip_static on;
gzip_proxied any;
gzip_min_length 1000;
gzip_comp_level 4;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
gzip是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
gzip_disable为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
gzip_static告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。
gzip_proxied允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。
gzip_min_length设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。
gzip_comp_level设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。
gzip_type设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。
# cache informations about file descriptors, frequently accessed files
# can boost performance, but you need to test those values
open_file_cache max=100000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
##
# Virtual Host Configs
# aka our settings for specific servers
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
open_file_cache打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。
open_file_cache_valid 在open_file_cache中指定检测正确信息的间隔时间。
open_file_cache_min_uses 定义了open_file_cache中指令参数不活动时间期间里最小的文件数。
open_file_cache_errors指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。
一个完整的配置
user www-data;
pid /var/run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 100000;
events {
worker_connections 2048;
multi_accept on;
use epoll;
}
http {
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
access_log off;
error_log /var/log/nginx/error.log crit;
keepalive_timeout 10;
client_header_timeout 10;
client_body_timeout 10;
reset_timedout_connection on;
send_timeout 10;
limit_conn_zone $binary_remote_addr zone=addr:5m;
limit_conn addr 100;
include /etc/nginx/mime.types;
default_type text/html;
charset UTF-8;
gzip on;
gzip_disable "msie6";
gzip_proxied any;
gzip_min_length 1000;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
open_file_cache max=100000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
编辑完配置后,确认重启nginx使设置生效。
sudo service nginx restart
后记
就这样!你的Web服务器现在已经就绪,之前困扰你的众多访问者的问题来吧。这并不是加速网站的唯一途径,很快我会写更多介绍其他加速网站方法的文章的。
原文发布时间:2015-04-15
本文来自云栖合作伙伴“linux中国”
Nginx深度优化
隐藏版本号
修改用户与组
网页缓存时间
日志切割
连接超时
更改进程数
网页压缩
防盗链
FPM参数优化
一、隐藏版本号
1.在centos7系统中通过curl命令查看
curl -I http://192.168.100.26
2.修改nginx.conf配置文件,在http{}内添加server_tokens off;语句
3.重启nginx
killall -1 nginx
4.使用curl命令查看验证
curl -I http://192.168.100.26
二、修改用户与组
Nginx运行时进程需要有用户和组的支持,用以实现对网站文件读取时进行访问控制。主进程由root创建,子进程由指定的用户与组创建,默认为nobody。
1.编译nginx时指定用户与组
./configure
--prefix=/usr/local/nginx
--user=nginx
--group=nginx
--with-http_stub_status_module
2.修改nginx配置文件指定用户与组
vim /usr/local/nginx/conf/nginx.conf
3.重启nginx
killall -1 nginx
4.查看nginx进程信息(主进程root用户,子进程nginx用户)
ps aux | grep nginx
三、网页缓存时间
当Nginx将网页数据放回给客户端后,可以设置缓存时间,以便日后进行重复请求访问,以加快访问速度、同时减轻服务器压力,一般对静态资源进行设置,对动态网页不要设置缓存时间。
1.下面对网站的图片进行指定缓存时间设置
2.修改nginx配置文件,指定缓存时间为1天
vim /usr/local/nginx/conf/nginx.conf
location ~.(gif|jpg|jepg|png|bmp|ico)$ {
root html;
expires 1d;
}
3.重启nginx
killall -1 nginx
4.Fiddler工具进行抓包验证
四、日志切割
Nginx通过nginx的信号控制功能脚本来实现日志的自动切割,并将脚本加入到Linux的计划性任务中,让脚本在每天固定的时间执行,得以实现日志切割功能。
1.编写fenge.sh脚本
vim /opt/fenge.sh
#!/bin/bash
#Filename:fenge.sh
d=$(date -d "-1 day" "+%Y%m%d") #显示一天前的时间
logs_path="/var/log/nginx"
pid_path="/usr/local/nginx/logs/nginx.pid"
[ -d $logs_path ] || mkdir -p $logs_path
mv /usr/local/nginx/logs/access.log ${logs_path}/test.com-access.log-$d
kill -USR1 $(cat $pid_path) #创建新日志文件
find $logs_path -mtime +30 | xargs rm -rf #删除30天前的日志文件
2. 为脚本赋予执行权限
chmod +x /opt/fenge.sh
3.执行脚本,测试日志文件是否分割成功
. /fenge.sh
4.添加计划性任务
crontab -e
#每日凌晨1:00执行脚本
0 1 * /opt/fenge.sh
五、连接超时
一般网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现对连接访问时间的控制。
1. 修改nginx.conf配置文件
vim /usr/local/nginx/conf/nginx.conf
2.重启nginx
killall -1 nginx
3.对网站进行访问,并使用Fiddler工具进行抓包验证
六、更改进程数
在高并发环境中,需要启动更多的Nginx进程以保证快速响应,用以处理用户的请求,避免造成阻塞。
1.查看ngixn运行进程的个数
cat /proc/cpuinfo | grep -c "physical"
2.修改nginx.conf配置文件
vim /usr/local/nginx/conf/nginx.conf
3.重启nginx
killall-1 nginx
4.查看nginx进程数
ps aux | grep nginx
七、网页压缩
Nginx服务器将输出内容压缩后进行传输,以节约网站的带宽,提升用户的访问体验,默认已经安装了该模块。
1.修改nginx.conf配置文件
vim /usr/local/nginx/conf/nginx.conf
gzip on;
gzip_buffers 4 64k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_min_length 1k;
gzip_vary on;
gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss text/jpg text/png;
2.重启nginx
killall -1 nginx
3.创建一个大于1KB以上的网页文件,然后对其进行访问抓包
curl -I -H "Accept-Encoding: gzip, deflate" 192.168.100.26/
八、防盗链
在网站中,一般都要配置防盗链功能,以避免网站内容被非法盗用,造成经济损失,也避免了流量的浪费。
1.修改nginx.conf配置文件
vim /usr/local/nginx/conf/nginx.conf
location ~.(jpg|gif|swf)$ { #匹配.jpg 、.gif 、或 .swf结尾的文件
valid_referers none blocked .abc.com abc.com; #信任域名站点
if ( $invalid_referer ) {
rewrite ^/ http://www.abc.com/error.png; #重写返回error.png
}
}
2.重启nginx
killall -1 nginx
九、FPM参数优化
Nginx的PHP解析功能实现是由FPM处理的,为了提高PHP的处理速度,可对FPM模块进行参数的调整。
1.安装带有FPM模块的PHP环境;
2.FPM进程有两种启动方式,由pm参数指定,分别是static和dynamic,前者将产生固定数据的FPM进程,后者将以动态的方式产生FPM进程;
1.修改php-fpm.conf文件
vi php-fpm.conf
pid = run/php-fpm.pid
pm = dynamic #动态方式
pm.max_children=20 #最大启动进程数量为20个
pm.start_servers = 5 #初始启动时进程为5个
pm.min_spare_servers = 2 #最小空闲进程数为2个
pm.max_spare_servers = 8 #最大空闲进程数为8个
迎工作一到五年的Java工程师朋友们加入Java架构开发:860113481
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
Nginx服务整理 优化点
Nginx最大客户连接数算法一些遐想
现在很多互联网公司都在使用nginx,并且替换掉以前的Apache,nginx的优点就不说了,浅聊两句nginx的某些配置参数,找到这些参数设置的目的和关联性,并且理论计算出nginx的并发量。
废话不多说,贴跟其相关的配置选项
依次讲解各个参数的用途:
worker_processes:表示开启nginx的worker进程的个数,nginx启动会开两种进程,master进程用来管理调度,worker进程用来处理请求;
上面表示两种设置方法,比如
方法一:worker_processes auto;
表示设置服务器cpu核数匹配开启nginx开启的worker进程数
查看cpu核数:lscpu、cat /proc/cpuinfo
方法二:nginx设置cpu亲和力
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
00000001表示启用第一个CPU内核,00000010表示启用第二个CPU内核,以此类推
worker_cpu_affinity:表示开启八个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核,以此类推。
这种设置方法更高效,因将每个cpu核提供给固定的worker进程服务,减少cpu上下午切换带来的资源浪费
如果服务器cpu有限
比如:2核CPU,开启2个进程,设置如下
worker_processes 2;
worker_cpu_affinity 01 10;
比如:2核CPU,开启4个进程,设置如下
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
注意:本人基于nginx1.6.2版本(后面版本没有测试),压测实验证明worker_processes最多开启8个,8个以上性能没什么提升,反而稳定性变得更低。
worker_rlimit_nofile 65535;
这个参数表示worker进程最多能打开的文件句柄数,基于liunx系统ulimit设置
查看系统文件句柄数最大值:ulimit -n
注意:Linux一切皆文件,所有请求过来最终目的访问文件,所以该参数值设置等同于liunx系统ulimit设置为优
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
events模块处理网络事件
epoll:网络模型高效(相当于建立索引查找结果),nginx配置应该启用该参数
worker_connections:该参数表示设置一个worker进程最多开启多少线程数
优化设置应该等同于worker_rlimit_nofile设置值,表明一个线程处理一个http请求,同时可以处理一个文件数,各个模块之间协调合作不等待。
http {
keepalive_timeout 65;
keepalive_timeout:该参数表示客户端和nginx之间设置http(基于tcp协议)长连接,长连接的优势不用说了吧,长连接是否打开基于业务类型
设置65秒表示一个TCP请求保持会话时常为65秒,65秒内TCP状态码转化至TIME_WAIT转态
如果要使该线程可以拿来重新处理其他的请求:
方法一:TCP的TIME_WAIT转换至CLOSE转态,等待60秒左右(2倍MLS时间:表示请求绕着全球走一圈的时间)没有得到响应自然释放连接;
方法二:TCP复用和强制回收
cat /etc/sysctl.conf:设置net.ipv4.tcp_tw_reuse、net.ipv4.tcp_tw_recycle等参数
上面讲解各个参数的功能,这次主要目的讲解nginx能处理客户端最大连接数,以下讲解的都是理论值(因不考虑I/O调度或者网络因素等其他原因)
我们知道nginx即可以作为服务器使用,又可以作为反向代理使用,计算公式如下:
nginx作为http服务器的时候:
max_clients = worker_processes * worker_connections/2
nginx作为反向代理服务器的时候:
max_clients = worker_processes * worker_connections/4
注意:
为什么除以2:该公式基于http 1.1协议,一次请求大多数浏览器发送两次连接,并不是request和response响应占用两个线程(很多人也是这么认为,实际情况:请求是双向的,连接是没有方向的,由上面的图可以看出来)
为什么除以4:因nginx作为方向代理,客户端和nginx建立连接,nginx和后端服务器也要建立连接
由此,我们可以计算nginx作为http服务器最大并发量(作为反向代理服务器自己类推),可以为压测和线上环境的优化提供一些理论依据:
单位时间(keepalive_timeout)内nginx最大并发量C
C=worker_processes * worker_connections/2=8*65535/2
而每秒的并发量CS
CS=worker_processes * worker_connections/(2*65)
基于上面的公式知道,为了避免大量TCP连接time_out情况,优化过程中可以考虑这方面的原因:
1:keepalive_timeout设置时常(会话保持):可以根据业务来设置多少,因一次请求真正释放掉线程为其他的连接使用所花时间为:keepalive_timeout+2MLS
2:nginx作为反向代理使用:keepalive_timeout只是开启客户端和nginx的长连接,nginx和后端的长连接默认是没有开启的,设置如下:
upstream test
{
server 172.16.34.2:8000;
server 172.16.34.3:8000;
server 172.16.34.4:8000;
keepalive 60;
}
本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1909644,如需转载请自行联系原作者
Web服务器那些招
服务器每天日志处理
使用服务器自带的/etc/logrotate
配置文件:
/etc/logrotate.d/nginx
比如nginx:
/usr/local/nginx/logs/access.log {
rotate 3
compress
delaycompress
daily
dateext
ifempty
maxage 3
sharedscripts
postrotate
/usr/bin/kill -USR1 `cat /var/run/nginx.pid`
endscript
}
http://blog.csdn.net/iiisan/article/details/1180419
注意这里的postrotate,发送一个USR1信号给nginx,这样nginx收到这个信号就会重新获取新的accesslog文件的句柄了。否则nginx持有的文件句柄有可能是错误的。
nginx的fast-cgi param
fastcgi_param RELEASE 1可以设置下
来区分是开发环境还是线上环境
代码中可以使用$_SERVER[‘RELEASE’]获取
如何估计单机可承受的在线数量
1 获取机器内存
2 看每个php-fpm会占用多少内存,计算可以开多少个php-fpm
3 看每个php进程会占用多少时间
4 计算每秒一个php-fpm会处理多少请求
5 可以计算出单个机器可以处理多少请求
nginx的access_log
nginx的access_log必须设置off才会停止
如果什么都没有设置,它还是会记录access_log
Linux内核升级
2.6.32比以前的版本对系统的稳定和性能提升有指数级的优化。所以建议低版本都升级到这个版本以上
xarg参数i
问题:
echo a|xarg echo b
这样会返回b a
要想返回a b就要这样设置
echo a|xarg –i echo {} b
xarg就会代替大括号
suggest表现
对于前端有suggest的功能
千万不要监听onchange事件,当输入框输入一个键的时候就调用一次接口,这样对后端压力会很大。
应该使用setTimeOut或者setIntval之类的方式,定期判断输入框是否有变化,然后再决定是否调用接口。
nginx的worker_processes该怎么设置
设置和cpu核数一样
并且还需要设置nginx_worker_cpu_affinity
这里有详细的文章参考:
http://www.1990y.com/nginx-worker-process-affinity/comment-page-1/#comment-4973
其中nginx_worker_cpu_affinity如果不设置的话就是让计算机自己判断,其实效率和一般的也没有什么大的区别
Get请求的Url长度限制
HTTP协议并没有限制url长度
PHP没有限制url长度
一般浏览器限制url长度为2000字节
apache限制url为8000字节,在LimitRequestLine中设置
nginx对header的限制为large_client_header_buffers
给小白的 Nginx 30分钟入门指南
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
为什么要用Nginx?
目前 Nginx 的主力竞争对手莫过于 Apache ,在这里小编对两者做一个简单的对比,帮助大家更好的理解 Nginx 的优势。
1、作为 Web 服务器:
相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一,能够支持高达 50000 个并发连接数的响应, 感谢Nginx 为我们选择了 epoll and kqueue 作为开发模型。
Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理 服务器对外进行服务。Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
2、Nginx 配置简洁, Apache 复杂:
Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够不间断服务的情况下进行软件版本的升级。
Nginx 静态处理性能比 Apache 高 3倍以上,Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端来使用 ,Apache 的组件比 Nginx 多。
3、最核心的区别在于:
apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程 。
4、两者的擅长领域分别是:
nginx的优势是处理静态请求,cpu内存使用率低,apache适合处理动态请求,所以现在一般前端用nginx作为反向代理抗住压力,apache作为后端处理动态请求。
Nginx 基本使用方法
系统平台:CentOS release 6.6 (Final) 64位。
一、安装编译工具及库文件
二、首先要安装 PCRE
1、PCRE 作用是让 Nginx 支持 Rewrite 功能。下载 PCRE 安装包,下载地址: http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
2、解压安装包:
3、进入安装包目录
4、编译安装
5、查看pcre版本
三、安装 Nginx
1、下载 Nginx,下载地址:http://nginx.org/download/nginx-1.6.2.tar.gz
2、解压安装包
3、进入安装包目录
4、编译安装
5、查看nginx版本
到此,nginx安装完成。
四、Nginx 配置
创建 Nginx 运行使用的用户 www:
配置nginx.conf ,将/usr/local/webserver/nginx/conf/nginx.conf替换为以下内容
检查配置文件ngnix.conf的正确性命令:
五、启动 Nginx
Nginx 启动命令如下:
六、访问站点
从浏览器访问我们配置的站点ip:
Nginx 常用指令说明
1. main 全局配置
nginx在运行时与具体业务功能(比如http服务或者email服务代理)无关的一些参数,比如工作进程数,运行的身份等。
woker_processes 2
在配置文件的顶级main部分,worker角色的工作进程的个数,master进程是接收并分配请求给worker处理。这个数值简单一点可以设置为cpu的核数grep ^processor /proc/cpuinfo | wc -l,也是 auto 值,如果开启了ssl和gzip更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。如果nginx服务器还有其它服务,可以考虑适当减少。
worker_cpu_affinity
也是写在main部分。在高并发情况下,通过设置cpu粘性来降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗。如worker_cpu_affinity 0001 0010 0100 1000; (四核)。
worker_connections 2048
写在events部分。每一个worker进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)。nginx作为反向代理服务器,计算公式 最大连接数 = worker_processes * worker_connections/4,所以这里客户端最大连接数是1024,这个可以增到到8192都没关系,看情况而定,但不能超过后面的worker_rlimit_nofile。当nginx作为http服务器时,计算公式里面是除以2。
worker_rlimit_nofile 10240
写在main部分。默认是没有设置,可以限制为操作系统最大的限制65535。
use epoll
写在events部分。在Linux操作系统下,nginx默认使用epoll事件模型,得益于此,nginx在Linux操作系统下效率相当高。同时Nginx在OpenBSD或FreeBSD操作系统上采用类似于epoll的高效事件模型kqueue。在操作系统不支持这些高效模型时才使用select。
2. http服务器
与提供http服务相关的一些配置参数。例如:是否使用keepalive啊,是否使用gzip进行压缩等。
sendfile on
开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,减少用户空间到内核空间的上下文切换。对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
keepalive_timeout 65 : 长连接超时时间,单位是秒,这个参数很敏感,涉及浏览器的种类、后端服务器的超时设置、操作系统的设置,可以另外起一片文章了。长连接请求大量小文件的时候,可以减少重建连接的开销,但假如有大文件上传,65s内没上传完成会导致失败。如果设置时间过长,用户又多,长时间保持连接会占用大量资源。
send_timeout : 用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
client_max_body_size 10m
允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值
client_body_buffer_size 128k
缓冲区代理缓冲用户端请求的最大字节数
模块http_proxy:
这个模块实现的是nginx作为反向代理服务器的功能,包括缓存功能(另见文章)
proxy_connect_timeout 60
nginx跟后端服务器连接超时时间(代理连接超时)
proxy_read_timeout 60
连接成功后,与后端服务器两个成功的响应操作之间超时时间(代理接收超时)
proxy_buffer_size 4k
设置代理服务器(nginx)从后端realserver读取并保存用户头信息的缓冲区大小,默认与proxy_buffers大小相同,其实可以将这个指令值设的小一点
proxy_buffers 4 32k
proxy_buffers缓冲区,nginx针对单个连接缓存来自后端realserver的响应,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k
高负荷下缓冲大小(proxy_buffers*2)
proxy_max_temp_file_size
当proxy_buffers放不下后端服务器的响应内容时,会将一部分保存到硬盘的临时文件中,这个值用来设置最大临时文件大小,默认1024M,它与proxy_cache没有关系。大于这个值,将从upstream服务器传回。设置为0禁用。
proxy_temp_file_write_size 64k
当缓存被代理的服务器响应到临时文件时,这个选项限制每次写临时文件的大小。proxy_temp_path(可以在编译的时候)指定写到哪那个目录。
proxy_pass,proxy_redirect见 location 部分。
模块http_gzip:
gzip on : 开启gzip压缩输出,减少网络传输。
gzip_min_length 1k : 设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是20。建议设置成大于1k的字节数,小于1k可能会越压越大。
gzip_buffers 4 16k : 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。
gzip_http_version 1.0 : 用于识别 http 协议的版本,早期的浏览器不支持 Gzip 压缩,用户就会看到乱码,所以为了支持前期版本加上了这个选项,如果你用了 Nginx 的反向代理并期望也启用 Gzip 压缩的话,由于末端通信是 http/1.0,故请设置为 1.0。
gzip_comp_level 6 : gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
gzip_types :匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。
gzip_proxied any : Nginx作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩,匹配的前提是后端服务器必须要返回包含”Via”的 header头。
gzip_vary on : 和http头有关系,会在响应头加个 Vary: Accept-Encoding ,可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Squid缓存经过Nginx压缩的数据。。
3. server虚拟主机
http服务上支持若干虚拟主机。每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置。在提供mail服务的代理时,也可以建立若干server。每个server通过监听地址或端口来区分。
listen
监听端口,默认80,小于1024的要以root启动。可以为listen *:80、listen 127.0.0.1:80等形式。
server_name
服务器名,如localhost、www.example.com,可以通过正则匹配。
模块http_stream
这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡,upstream后接负载均衡器的名字,后端realserver以 host:port options; 方式组织在 {} 中。如果后端被代理的只有一台,也可以直接写在 proxy_pass 。
4. location
http服务中,某些特定的URL对应的一系列配置项。
root /var/www/html
定义服务器的默认网站根目录位置。如果locationURL匹配的是子目录或文件,root没什么作用,一般放在server指令里面或/下。
index index.jsp index.html index.htm
定义路径下默认访问的文件名,一般跟着root放
proxy_pass http:/backend
请求转向backend定义的服务器列表,即反向代理,对应upstream负载均衡器。也可以proxy_pass http://ip:port。
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
这四个暂且这样设,如果深究的话,每一个都涉及到很复杂的内容,也将通过另一篇文章来解读。
关于location匹配规则的写法,可以说尤为关键且基础的,参考文章 nginx配置location总结及rewrite规则写法;
5. 其它
5.1 访问控制 allow/deny
Nginx 的访问控制模块默认就会安装,而且写法也非常简单,可以分别有多个allow,deny,允许或禁止某个ip或ip段访问,依次满足任何一个规则就停止往下匹配。如:
我们也常用 httpd-devel 工具的 htpasswd 来为访问的路径设置登录密码:
这样就生成了默认使用CRYPT加密的密码文件。打开上面nginx-status的两行注释,重启nginx生效。
5.2 列出目录 autoindex
Nginx默认是不允许列出整个目录的。如需此功能,打开nginx.conf文件,在location,server 或 http段中加入autoindex on;,另外两个参数最好也加上去:
autoindex_exact_size off; 默认为on,显示出文件的确切大小,单位是bytes。改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间
《高性能Linux服务器构建实战》——1.4节Nginx的安装与配置
1.4 Nginx的安装与配置
1.4.1 下载与安装NginxNginx的官方网站是http://sysoev.ru/nginx/,英文主页为http://nginx.net,从这里可以获得Nginx的最新版本信息。Nginx有三个版本:稳定版、开发版和历史稳定版。开发版更新较快,包含最新的功能和bug的修复,但同时也可能会出现新的bug。开发版一旦更新稳定下来,就会被加入稳定版分支中。然而有些新功能不一定会被加到稳定版中去。稳定版更新较慢,但是bug较少,可以作为生产环境的首选,因此通常建议使用稳定版。历史稳定版为以往稳定版本的汇总,不包含最新的功能。这里选择当前的稳定版本nginx-0.7.65作为介绍对象,开始介绍编译安装。在安装Nginx之前,确保系统已经安装了gcc、openssl-devel、pcre-devel和zlib-devel软件库。Linux开发库是在安装系统时通过手动选择安装的,gcc、openssl-devel、zlib-devel三个软件库可以通过安装光盘直接选择安装,而pcre-devel库默认不在系统光盘中,所以这里重点介绍pcre-devel库。1.安装Nginx所需的pcre-devel库安装pcre库是为了使Nginx支持HTTP Rewrite 模块。下面进行安装,过程如下:
[root@localhost home]# tar zxvf pcre-8.02.tar.gz
[root@localhost home]# cd pcre-8.02
[root@localhost pcre-8.02]#make
[root@localhost pcre-8.02]#make install
2.开始安装Nginx Nginx的安装非常简单。在默认情况下,经过编译安装的Nginx包含了大部分可用模块。可以通过“./configure --help”选项设置各个模块的使用情况,例如对不需要的http_ssi模块,可通过“--without-http_ssi_module”方式关闭此。同理,如果需要“http_perl”模块,那么可以通过“--with-http_perl_module”方式进行安装。下面是安装过程:
[root@localhost home]# tar zxvf nginx-0.7.65.tar.gz
[root@localhost home]#cd nginx-0.7.65
[root@localhostnginx-0.7.65]#./configure \
--with-http_stub_status_module --prefix=/opt/nginx
[root@localhost nginx-0.7.65]#make
[root@localhost nginx-0.7.65]#make install
在上面的configure选项中,“--with-http_stub_status_module”可以用来启用 Nginx 的 NginxStatus 功能,以监控 Nginx 的当前状态。至此,Nginx已经安装完成了。
1.4.2 Nginx配置文件的结构Nginx的配置文件是一个纯文本文件,它一般位于Nginx安装目录的conf目录下,整个配置文件是以block的形式组织的。每个block一般以一个大括号“{}”来表示,block可以分为几个层次,整个配置文件中main指令位于最高层,在main层下面可以有Events、HTTP等层级,而在HTTP层中又包含有server层,即server block,server block中又可分为location层,并且一个server block中可以包含多个location block。一个完整的配置文件结构如图1-2所示。
在了解完配置文件结构之后,就可以开始配置和调试Nginx了。
1.4.3 配置与调试NginxNginx安装完毕后,会产生相应的安装目录,根据前面的安装路径,Nginx的配置文件路径为/opt/nginx/conf,其中nginx.conf为Nginx的主配置文件。这里重点介绍nginx.conf这个配置文件。Nginx配置文件主要分为4部分:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和 location(URL匹配特定位置的设置)。main部分设置的指令将影响其他所有设置;server部分的指令主要用于指定主机和端口;upstream指令主要用于负载均衡,设置一系列的后端服务器;location部分用于匹配网页位置。这四者之间的关系如下:server继承main,location继承server,upstream既不会继承其他设置也不会被继承。在这4个部分当中,每个部分都包含若干指令,这些指令主要包含Nginx的主模块指令、事件模块指令、HTTP核心模块指令。同时每个部分还可以使用其他HTTP模块指令,例如Http SSL模块、Http Gzip Static模块和Http Addition模块等。下面通过一个Nginx配置实例,详细介绍nginx.conf每个指令的含义。为了能更清楚地了解Nginx的结构和每个配置选项的含义,这里按照功能点将Nginx配置文件分为7个部分依次讲解。下面就围绕这7个部分进行介绍。
Nginx的全局配置下面这段内容是对Nginx的全局属性配置,代码如下:
user nobody nobody;
worker_processes 4;
error_log logs/error.log notice;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
events{
use epoll;
worker_connections 65536;
}
上面这段代码中每个配置选项的含义解释如下: user是个主模块指令,指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。 worker_processes是个主模块指令,指定了Nginx要开启的进程数。每个Nginx进程平均耗费10MB~12MB内存。根据经验,一般指定一个进程足够了,如果是多核CPU,建议指定和CPU的数量一样多的进程数即可。 error_log是个主模块指令,用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。 pid是个主模块指令,用来指定进程id的存储文件位置。 worker_rlimit_nofile用于绑定worker进程和CPU, Linux内核2.4以上可用。 events指令用来设定Nginx的工作模式及连接数上限。 use是个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。 worker_connections也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024。最大客户端连接数由worker_processes和worker_connections决定,即max_client=worker_processesworker_connections,在作为反向代理时变为:max_clients = worker_processes worker_connections/4。进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。
HTTP服务器配置接下来开始对HTTP服务器进行配置。
下面这段内容是Nginx对HTTP服务器相关属性的配置,代码如下:
http{
include conf/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
client_max_body_size 20m;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;
client_header_timeout 10;
client_body_timeout 10;
send_timeout 10;
下面详细介绍这段代码中每个配置选项的含义。 include是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。类似于Apache中的include方法。 default_type属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。下面的代码实现对日志格式的设定。
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
log_format是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log指令中引用。 client_max_body_size用来设置允许客户端请求的最大的单个文件字节数。 client_header_buffer_size用于指定来自客户端请求头的headerbuffer大小。对于大多数请求,1KB的缓冲区大小已经足够,如果自定义了消息头或有更大的cookie,可以增加缓冲区大小。这里设置为32KB。 large_client_header_buffers用来指定客户端请求中较大的消息头的缓存最大数量和大小, “4”为个数,“128K”为大小,最大缓存为4个128KB。 sendfile参数用于开启高效文件传输模式。将tcp_nopush和tcp_nodely两个指令设置为on,用于防止网络阻塞。 keepalive_timeout用于设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。 client_header_timeout用于设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误。 client_body_timeout用于设置客户端请求主体读取超时时间,默认值为60。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误。
send_timeout用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。
HttpGzip模块配置下面配置Nginx的HttpGzip模块。这个模块支持在线实时压缩输出数据流。要查看是否安装了此模块,需要使用下面的命令:
[root@localhost conf]# /opt/nginx/sbin/nginx -V
nginx version: nginx/0.7.65
configure arguments: --with-http_stub_status_module --with-http_gzip_static_module --prefix=/opt/nginx
通过/opt/nginx/sbin/nginx -V命令可以查看安装Nginx时的编译选项。由输出可知,我们已经安装了HttpGzip模块。下面是HttpGzip模块在Nginx配置中的相关属性设置:
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
gzip用于设置开启或者关闭gzip模块,“gzip on”表示开启gzip压缩,实时压缩输出数据流。 gzip_min_length用于设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1K的字节数,小于1K可能会越压越大。 gzip_buffers表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。 gzip_http_version用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持gzip解压,使用默认即可。 gzip_comp_level用来指定gzip压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗CPU资源。 gzip_types用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的。 gzip_vary选项可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Squid缓存经过Nginx压缩的数据。4.负载均衡配置下面设定负载均衡的服务器列表。
upstream ixdba.net{
ip_hash;
server 192.168.12.133:80;
server 192.168.12.134:80 down;
server 192.168.12.135:8009 max_fails=3 fail_timeout=20s;
server 192.168.12.136:8080;
}
upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称ixdba.net。这个名称可以任意指定,在后面需要用到的地方直接调用即可。Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方调度算法。 轮询(默认)。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。 Weight。指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。 ip_hash。每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。 fair。这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。 url_hash。此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有: down,表示当前的server暂时不参与负载均衡。 backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。 max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。 fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。注意 当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
server虚拟主机配置下面介绍对虚拟主机的配置。建议将对虚拟主机进行配置的内容写进另外一个文件,然后通过include指令包含进来,这样更便于维护和管理。
server{
listen 80;
server_name 192.168.12.188 www.ixdba.net;
index index.html index.htm index.jsp;
root /web/wwwroot/www.ixdba.net
charset gb2312;
server标志定义虚拟主机开始;listen用于指定虚拟主机的服务器端口;server_name用来指定IP地址或者域名,多个域名之间用空格分开;index用于设定访问的默认首页地址;root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径;charset用于设置网页的默认编码格式。
access_log logs/www.ixdba.net.access.log main;
access_log用来指定此虚拟主机的访问日志存放路径。最后的main用于指定访问日志的输出格式。
URL匹配配置URL地址匹配是Nginx配置中最灵活的部分。 location支持正则表达式匹配,也支持条件判断匹配,用户可以通过location指令实现Nginx对动、静态网页的过滤处理。
以下这段设置是通过location指令来对网页URL进行分析处理,所有扩展名为.gif、.jpg、.jpeg、.png、.bmp、.swf的静态文件都交给Nginx处理,而expires用来指定静态文件的过期时间,这里是30天。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /web/wwwroot/www.ixdba.net;
expires 30d;
}
以下这段设置是将upload和html下的所有文件都交给Nginx来处理,当然,upload和html目录包含在/web/wwwroot/www.ixdba.net目录中。
location ~ ^/(upload|html)/ {
root /web/wwwroot/www.ixdba.net;
expires 30d;
}
在最后这段设置中,location是对此虚拟主机下动态网页的过滤处理,也就是将所有以.jsp为后缀的文件都交给本机的8080端口处理。
location ~ .*.jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
}
7. StubStatus模块配置
StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在Nginx编译安装时手工指定才能使用。
以下指令指定启用获取Nginx工作状态的功能。
location /NginxStatus {
stub_status on;
access_log logs/NginxStatus.log;
auth_basic "NginxStatus";
auth_basic_user_file ../htpasswd;
}
stub_status为“on”表示启用StubStatus的工作状态统计功能;access_log 用来指定StubStatus模块的访问日志文件;auth_basic是Nginx的一种认证机制;auth_basic_user_file用来指定认证的密码文件。由于Nginx的auth_basic认证采用的是与Apache兼容的密码文件,因此需要用Apache的htpasswd命令来生成密码文件。例如要添加一个webadmin用户,可以使用下面的方式生成密码文件:
/usr/local/apache/bin/htpasswd -c /opt/nginx/conf/htpasswd webadmin
会得到以下提示信息:
New password:
输入密码之后,系统会要求再次输入密码,确认之后添加用户成功。要查看Nginx的运行状态,可以输入http://ip/ NginxStatus,然后输入刚刚创建的用户名和密码就可以看到如下信息:
Active connections: 1
server accepts handled requests
393411 393411 393799
Reading: 0 Writing: 1 Waiting: 0
Active connections表示当前活跃的连接数,第三行的3个数字表示 Nginx当前总共处理了393411个连接, 成功创建了393 411次握手,总共处理了393 799个请求。最后一行的Reading表示Nginx读取到客户端Header信息数; Writing表示Nginx返回给客户端的Header信息数;Waiting表示Nginx已经处理完、正在等候下一次请求指令时的驻留连接数。在最后这段设置中,设置了虚拟主机的错误信息返回页面,通过error_page指令可以定制各种错误信息的返回页面。在默认情况下,Nginx会在主目录的html目录中查找指定的返回页面。特别需要注意的是,这些错误信息的返回页面大小一定要超过512KB,否则会被IE浏览器替换为IE默认的错误页面。
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
1.4.4 Nginx的启动、关闭和平滑重启在完成对nginx.conf文件的配置后,就可以启动服务了。Nginx自身提供了一些用于日常维护的命令,下面进行详细的介绍。
Nginx基本信息检查(1)检查Nginx配置文件的正确性
Nginx提供的配置文件调试功能非常有用,可以快速定位配置文件存在的问题。执行如下命令可检测配置文件的正确性:
/opt/nginx/sbin/nginx –t 或者
/opt/nginx/sbin/nginx -t -c /opt/nginx/conf/nginx.conf
其中,“-t”参数用于检查配置文件是否正确,但并不执行,“-c”参数用于指定配置文件路径,如果不指定配置文件路径,Nginx默认会在安装时指定的安装目录下查找conf/nginx.conf文件。
如果检测结果显示如下信息,说明配置文件正确。
the configuration file /opt/nginx/conf/nginx.conf syntax is ok
configuration file /opt/nginx/conf/nginx.conf test is successful
(2)显示Nginx的版本以及相关编译信息
在命令行执行以下命令可以显示安装Nginx的版本信息:
/opt/nginx/sbin/nginx -v
执行以下命令可显示安装的Nginx版本和相关编译信息:
/opt/nginx/sbin/nginx -V
上述命令不但显示Nginx的版本信息,同时显示Nginx在编译时指定的相关模块信息。
Nginx的启动、关闭与重启Nginx对进程的控制能力非常强大,可以通过信号指令控制进程。常用的信号有:
QUIT,表示处理完当前请求后,关闭进程。 HUP,表示重新加载配置,也就是关闭原有的进程,并开启新的工作进程。此操作不会中断用户的访问请求,因此可以通过此信号平滑地重启Nginx。 USR1,用于Nginx的日志切换,也就是重新打开一个日志文件,例如每天要生成一个新的日志文件时,可以使用这个信号来控制。 USR2,用于平滑升级可执行程序。 WINCH ,从容关闭工作进程。(1)Nginx的启动Nginx的启动非常简单,只需输入如下命令:
/opt/nginx/sbin/nginx
即可完成Nginx的启动。Nginx启动后,可以通过如下命令查看Nginx的启动进程:
[root@localhost logs]# ps -ef|grep nginx
root 16572 1 0 11:14 ? 00:00:00 nginx: master process /opt/nginx/sbin/nginx
nobody 16591 16572 0 11:15 ? 00:00:00 nginx: worker process
nobody 16592 16572 0 11:15 ? 00:00:00 nginx: worker process
nobody 16593 16572 0 11:15 ? 00:00:00 nginx: worker process
nobody 16594 16572 0 11:15 ? 00:00:00 nginx: worker process
(2)Nginx的关闭如果要关闭Nginx进程,可以使用如下命令:kill -XXX pid其中,XXX就是信号名,pid是Nginx的进程号,可以通过如下两个命令获取:
ps -ef | grep "nginx: master process" | grep -v "grep" | awk -F ' ' '{print $2}'
cat /opt/nginx/logs/nginx.pid
(3)Nginx的平滑重启要不间断服务地重新启动Nginx,可以使用如下命令:
kill -HUP ‘cat /opt/nginx/logs/nginx.pid‘
Nginx 代理 | 学习笔记
开发者学堂课程【HTTP 代理系统第三课时:Nginx 代理】学习笔记,与课程紧密联系,让用户快速学习知识。课程地址:https://developer.aliyun.com/learning/course/803/detail/13874Nginx 代理 内容简介一. Nginx 的使用二. Nginx 配置反向代理三. Nginx 性能优化 一.Nginx 的使用1.1打开系统操作 1.1.1首先使用Curl 输入localhost ,此时没有启动Nginx。无法访问端口。 1.1.2此时可以使用systemctl status nginx 1.1.3此时启动nginx 进程进行启动 1.1.4 此时重新访问localhost 。 1.1.5添加参数,成功启动Nginx 1.2Nginx 的简单操作 1.2.1Nginx-h 帮助查看信息 1.2.2Nginx-t 检测配置文件是否可用 1.2.3Nginx-s reload 重新加载配置文件例:文件出错可先试用Nginx-t 检测,之后进行试用Nginx-s reload 重新启动。此方法可用确保每次加载信息都是正常可行的。例:如试用systemectl restart nginx ,则会显示报错。 1.2.4因此在使用之前要修改配置,重新试用Nginx-t检测,之后进行试用Nginx-s reload 重新启动,确保配置文件准确无误。 1.2.5Nginx-v 查看当前版本 1.2.6Nginx-V 查看配置文件的构建参数。二. Nginx 配置代理2.1 Nginx 配置正向定理2.2 Nginx 配置反向代理与正向代理不同的是在location 中使用了proxy-pass 传递了一个地址,是指所有请求代理地址进行请求。 三.Nginx 性能优化3.1 IPv4系统内核参数修改可以通过修改/etc/systclconf 来更新内核参数,并通过systcl-p 来应用修改参数 net.corenet_dev_max_backlog:表示每个网络接口接受数据包的速率比内核处理包的速率快时,允许发送到队列的数据包的最大数目。可以通过调整大小,使队列中有更多的数据。 netcore.somaxconn:表示系统同时发起的TCP链接数,可以提升该值,获得更高的并发阈值。 netipv4.tcpmaxorphans:表示系统最多允许存在多少TCPSocket 不关联到handler 上。超过这个数字的请求会被复位。netipv4tcpmaxsynbacklog:表示尚未收到客户端确认信息的连接请求最大值,内存越大,这个值可以修改的越大。3.2 CPU 参数修改Nginx 中有两个和内核调度有关的指令,可以提升Nginx 的并行处理能力 worker_process:该指令可以设置Nginx 的进程数,可以根据CPU 的核心数来设置,设置为CPU核心数或核心数的倍数。 workder_cpu_affnity:该指令可以为不同的woker_process 分配CPU.举例:当把woker_process 值设为4时,workder_cpu_affnity 为4位的2进制数。依次分配位置。举例:当把woker_process 值设为6时,workder_cpu_affnity 为6位的2进制数。依次分配位置3.3 网络参数修改keepalivetimeout 设置了Nginx 与客户端保持连接的超时时间,超过了这个时间,服务器会关闭连接。 send_timeout:设置Nginx 相应客户端的超时时间,如果客户端在这个时间内没有响应,就会关闭连接。 client_header_buffer_size:设置了客户端请求头缓冲区大小,默认为1Kb。如果Cookie过大,超出缓冲区大小,就会报错。 multi_accept设定Nginx 是否尽可能多的接受客户端的请求。 举例:如何配置修改Nginx 参数第一步:修改参数。在sysctl.conf下进行修改第二步:应用修改执行systcl-p 第三步:查看Nginx的配置在Nginx.conf当中查看配置信息第四步:检测是否正常运行输入Nginx-t进行检测再输入Nginx-s reload检测如果显示错误,再次进行输入systemctl statsu nginx,确定是否启动成功。输入Systemectl start nginx 启动第五步:配置虚拟主机与反向代理把配置文件放在Conf.d目录中 配置正向代理。配置反向代理