配置优化的几项:
1,nginx是基于事件的非阻塞模式的,也就是说一个进程可以处理多个请求,所以worker_processes不必要设置大高,一般小于等于cpu核数
2,静态文件缓存配置,最大缓存数量,文件未使用存活期
open_file_cache max=555350 inactive=20s;
open_file_cache_valid 30s; 每30s去检查一次文件有效
open_file_cache_min_uses 2; 有效期内文件最少使用次数,即20s中需要使用过2过或以上才会认为是需要缓存的。
3,work_connections是并发响应的关键配置,理论上是越大越好。可设置成最大可用sockets数量,这个值*worker_processes=最大客户连接数但使用浏览器访问时,最大客户连接数需要除以2,因为一次请求浏览器会开两个连接,如果是作为反向代理服务器则要除以4,因为代理到真实服务器还会再开2个连接
下面是一个完整的配置的详细说明:
#user nobody; #设置使用nginx的用户
worker_processes 1; #设置工作的进程数,通常设置为cpu个数 或 2倍
#设置错误文件存放路径 notice info 为级别
#error_log logs/error.log ;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; #设置pid存放路径(pid是控制系统中的重要文件)
#设置最大连接数
events {
worker_connections 1024;
}
#http中设置了http请求相关的配置 http中有多个server的配置
http {
include mime.types; #包含其它配置文件 通过这个文件找到请求文件类型与mime的映射关系
default_type application/octet-stream; #指定为二进制流 在上面文件的映射关系中没有找到映射关系的请求文件返回默认的二进制流
client_max_body_size 10M;
upstream xxxx{ #设置多个就可以实现负载均衡 将请求分发到下面两个server中 xxxx为自己定义的一个名称
server xx.xx.xx.xx:8080;
server xx.xx.xx.xy:8080;
}
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main; #设置访问日志路径 main为上面定义的日志格式 设置为off可关闭减少IO开销
error_log logs/error.log crit #设置为严格级别错误日志才记录
sendfile on; #启用内核复制模式 应该保持开启达到最快的IO效率
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 30s; #支持持久连接 不用每次请求都新开连接 所以设置一个连接的超时时间
#gzip on; #开启文件压缩传输 生产环境应该打开 gzip_min_length/gzip_types可设置压缩的最小长度及压缩类别
server { # server表示一个虚拟主机,http可有多个server 这个server模块是nginx配置反向代理的模块
listen 80; #监听端口
server_name localhost; #服务器名称 一个请求过来交给哪个server来处理 由这部分来决定
#charset utf-8; #设置字符编码
#access_log logs/host.access.log main; #日志文件
location / { #一个server下可有多个locatioin 匹配规则由location后的表达式决定
proxy_pass http://xxxx; #实现反向代理的功能 xxxx是上面upstream的名称 表示转发到upstream中的地址上去
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#error_page 404 /404.html;
#redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html; #50x错误到定向到50x.html;然后下面配置会去找安装目录下的html文件夹
location = /50x.html {
root html; #表示在html路径下找50x.html
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# 这个server模块是nginx配置虚拟主机的模块 下面配置表示监听某个ip:port以及默认定向地址
# another virtual host using mix of IP-, name-, and port-based configuration
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
配置上的第二部分的server是给出默认的nginx虚拟主机配置。首先需要在服务器配置IP地址,然后绑定IP地址与虚拟主机,可以通过配置多个server实现多个网站运行在同一nginx上。(虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的Intemet服务器功能(WWW、FTP、Email等),同一台主机上的虚拟主机之间是完全独立的。从网站访问者来看,每一台虚拟主机和一台独立的主机完全一样。
利用虚拟主机,不用为每个要运行的网站提供一台单独的Nginx服务器或单独运行一组Nginx进程。虚拟主机提供了在同一台服务器、同一组Nginx进程上运行多个网站的功能。--引用其它文章的解释)
一个http请求到达后,根据域名寻找到哪一个虚拟主机来处理,然后再根据域名后的地址匹配location表达式进而选择某一个location的处理规则(locatioin括号内的就是处理规则的描述)
location表达式匹配规则:
location表达式有两种匹配模式:普通字符串匹配,正则匹配
表达式形式为:location [=|~|~*|^~|@] /uri/{...} 中括号为可选
=表示精确匹配,请求必须和后面的uri一模一样
~表示使用正则表达式
~*使用正则且不区分大小写
^~ 不使用正则的匹配
@表示定义一个变量 用得少
匹配的步骤是:
1,先查找 =开头的精确匹配
2,再查找没有[ ]里任何符号的普通匹配,且为最大前缀规则,即以匹配得更精确的为准
3,第二步如果匹配上了也会继续寻找正则匹配,除非第二步使用了 ^* 就会忽略正则匹配了
4,如果正则匹配上了就以第一次正则匹配成功的结果为准(即只要成功匹配到一次就不再向下匹配了),否则以第2步的普通匹配结果为准