Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。
公共配置
1、并发连接配置
1.1 worker_processes
nginx运行工作进程个数,一般设置cpu的核心或者核心数x2。
nginx.conf配置文件中,设置:worker_processes 4。
worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。
1.2 worker_cpu_affinity
nginx默认是没有开启利用多核cpu的配置的。需要通过增加worker_cpu_affinity配置参数来充分利用多核cpu,cpu是任务处理,当计算最费时的资源的时候,cpu核使用上的越多,性能就越好。
使用方法和范例:
2核cpu,开启2个进程
worker_processes 2;
worker_cpu_affinity 01 10;
4cpu,开启4个进程 worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
1.3 worker_rlimit_nofile
这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n (ulimit -n 65535可设置最大打开文件数为65535)的值保持一致。
现在在Linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。实际我们填入一个65535,足够了,一个网站的并发达到这么大的数量,也算一个大站了!
1.4 work_connections
work_connections是单个worker进程允许客户端最大连接数,这个数值一般根据服务器性能和内存来制定.
nginx作为http服务器的时候:max_clients = worker_processes * worker_connections
Web服务器
相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应,感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型.
listen:表示当前的代理服务器监听的端口,默认的是监听80端口。注意,如果我们配置了多个server,这个listen要配置不一样,不然就不能确定转到哪里去了。
server_name:表示监听到之后需要转到哪里去,这时我们直接转到本地,这时是直接到nginx文件夹内。
location:表示匹配的路径,这时配置了/表示所有请求都被匹配到这里
root:里面配置了root这时表示当匹配这个请求的路径时,将会在这个文件夹内寻找相应的文件,这里对我们之后的静态文件伺服很有用。
index:当没有指定主页时,默认会选择这个指定的文件,它可以有多个,并按顺序来加载,如果第一个不存在,则找第二个,依此类推。
location:分为普通匹配以及正则匹配。
普通匹配,包括:^~(把这个前缀用于一个常规字符串,如果路径匹配那么不测试正则表达式)、 = (精确匹配)、无前缀。
普通匹配,遵循最长匹配规则,假设一个请求匹配到了两个普通规则,则选择匹配长度大的那个,一般情况下普通匹配成功后,还是会继续正则匹配,一旦正则匹配也匹配成功后,以正则匹配为准。但是^~和=除外,即^~和=匹配成功后,不再继续正则匹配。
正则 location:~ (区分大小写)、~*(不区分大小写) 。
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* .(gif|jpg|jpeg)$ {
[ configuration E ]
}
“/”请求会匹配到A,精确匹配。
“/index.html”会匹配到B,
“/documents/document.html”请求会匹配到C,
“/images/1.gif”会匹配到D,
“/documents/1.jpg”会匹配到E。
location里还可添加try_files: $uri $uri/ /index.html。依次按照顺序检查文件是否存在.
反向代理和域名转发
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
user www www;
worker_processes 1;
error_log logs/error.log;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
#Nginx事件处理模型
events {
use epoll; #nginx采用epoll事件模型,处理效率高
worker_connections 65535;
multi_accept on;#默认是on,设置为on后,多个worker按串行方式来处理连接,也就是一个连接只有一个worker被唤醒,其他的处于休眠状态,设置为off后,多个worker按并行方式来处理连接,也就是一个连接会唤醒所有的worker,直到连接分配完毕,没有取得连接的继续休眠。当你的服务器连接数不多时,开启这个参数会让负载有一定的降低,但是当服务器的吞吐量很大时,为了效率,可以关闭这个参数。
}
http {
include mime.types;
default_type application/octet-stream;
include /usr/local/nginx/conf/reverse-proxy.conf;
sendfile on;#//开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
keepalive_timeout 65;#客户端连接保持会话超时时间,超过这个时间,服务器断开这个链接
gzip on;
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
client_body_buffer_size 256k;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_send_timeout 300s;
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
内利用反向代理做负载均衡
upstream www.lcapi.com{
server localhost:8080;
server localhost:9080;
}
server{
listen 80;
autoindex on;
server_name www.lcapi.com;
access_log /usr/local/nginx/logs/access.log combined;
index index.html index.htm index.jsp index.php;
#error_page 404 /404.html;
if ( $query_string ~* ".*[;'<>].*" ){
return 404;
}
location / {
proxy_pass http://www.lcapi.com;
add_header Access-Control-Allow-Origin *;
}
}
我们在server外添加了一个upstream,而直接在proxy_pass里面直接用http://+upstream的名称来使用。upstream中的server元素必须要注意,不能加http://,但proxy_pass中必须加。
1)轮询(默认)
默认选项,当weight不指定时,各服务器weight相同, 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream www.lcapi.com{
server localhost:8080;
server localhost:9080;
}
2)weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。如果后端服务器down掉,能自动剔除。 比如下面配置,则1.11服务器的访问量为1.10服务器的两倍(后端节点中配置高的服务器可以适当将weight设置大点)。
upstream www.lcapi.com{
server 192.168.1.10 weight=1;
server 192.168.1.11 weight=2;
}
3)ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题,实现session共享。如果后端服务器down掉,要手工处理。
upstream resinserver {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
4)url_hash
5)fair(第三方)
实战应用
使用Nginx本地搭建自己的本地图片服务器,上传到相应目录,用于开发过程中启动tomcat图片丢失的问题,后期上传到服务器,要改用ftp上传。
注意:此处要在D盘目录下创建 D:\\olife\\uploadfiles夹,上传到此处,不然会访问不到的。
访问路径http://127.0.0.1:30000/uploadfiles/+文件名
nginx.conf配置
location ^~ /uploadfiles/ {
expires 24h;
root D:\\olife\\;#指定图片存放路径
access_log D:\\logs\\images.log;#日志存放路径
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_temp_path D:\\olife\\;#图片访问路径
proxy_redirect off;
proxy_set_header Host 127.0.0.1;
client_max_body_size 10m;
client_body_buffer_size 1280k;
proxy_connect_timeout 900;
proxy_send_timeout 900;
proxy_read_timeout 900;
proxy_buffer_size 40k;
proxy_buffers 40 320k;
proxy_busy_buffers_size 640k;
proxy_temp_file_write_size 640k;
if ( !-e $request_filename)
{
proxy_pass http://127.0.0.1:8091;#默认80端口
}
}