安装时的配置文件
#user nobody;
#nginx进程,一般数值为cpu核数
worker_processes 1;
#错误日志存放目录
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#进程pid存放位置
#pid logs/nginx.pid;
#工作模式及连接数上限
events {
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
}
http {
#文件扩展名与类型映射表
include mime.types;
#默认文件类型
default_type application/octet-stream;
#设置日志模式
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#nginx访问日志
#access_log logs/access.log main;
#开启高效传输模式
sendfile on;
#激活tcp_nopush参数可以允许把httpresponse header和文件的开始放在一个文件里发布, 积极的作用是减少网络报文段的数量
#tcp_nopush on;
#连接超时时间,单位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
#开启gzip压缩功能
#gzip on;
#基于域名的虚拟主机
server {
#监听端口
listen 80;
server_name localhost;
#编码识别
#charset koi8-r;
#日志格式及日志存放路径
#access_log logs/host.access.log main;
location / {
#站点根目录,即网站程序存放目录
root html;
#首页排序
index index.html index.htm;
}
#错误页面
#error_page 404 /404.html;
# 将服务器错误页面重定向到静态页面/50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#代理PHP脚本到Apache上监听127.0.0.1:80
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
#将PHP脚本传递到正在监听127.0.0.1:9000的FastCGI服务器
#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;
#}
#如果Apache的文档根目录与nginx的根目录一致,则拒绝访问.htaccess文件
#location ~ /\.ht {
# deny all;
#}
}
#另一个虚拟主机,混合使用IP、名称和基于端口的配置
#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;
# 服务端key
# 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;
# }
#}
}
使用中的配置文件(所有ip,域名,路径皆为虚构)
#user nobody;
worker_processes 2;
error_log logs/error.log;
pid logs/nginx.pid;
#最大文件打开数(连接),可设置为系统优化后的ulimit -HSn的结果
worker_rlimit_nofile 360000;
events {
#epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
use epoll;
#单个后台worker process进程的最大并发链接数
worker_connections 100000;
#是否串行处理连接
multi_accept off;
}
http {
#文件扩展名与类型映射表
include mime.types;
#默认文件类型
default_type application/octet-stream;
#设定请求缓存
#户端请求的最大可接受体大小,由行表示
client_max_body_size 50m;
#服务器名字的hash表大小
server_names_hash_bucket_size 256;
#客户机的请求头设置大小,对于绝大多数请求,1K的缓冲区大小就足够了
client_header_buffer_size 256k;
#用来指定客户端请求中较大的消息头的缓存最大数量和大小
large_client_header_buffers 4 256k;
#用于配置转发至tomcat后;tomcat获取客户端正式ip
#允许重新定义和添加一些将被传输到代理服务器的请求头行。作为值,可以使用文本、变量及其组合。
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#解决js跨域的问题
#增加头标
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
#指定客户机请求体缓冲区大小。
client_body_buffer_size 256k;
#客户机的请求头设置读取超时。
client_header_timeout 3m;
#客户机的请求体设置读取超时。
client_body_timeout 3m;
#客户端分配响应超时时间。
send_timeout 3m;
#访问日志存放路径
access_log no;
#客户端连接保持活动的超时时间,在超过这个时间之后服务器会关闭该链接。
keepalive_timeout 0;
#修改或隐藏Nginx的版本号
server_tokens off;
#虚拟主机配置
server {
#listen指令指定所包含的服务器接受的地址和端口。可以只指定地址、端口或服务器名作为地址
listen 80;
#e用来指定ip地址或者域名,多个域名之间用空格分开
server_name localhost;
#对 "/gzh" 启用反向代理
location /gzh
{
#根据表达式来更改URI,或者修改字符串。注意重写表达式只对相对路径有效。
#此处是将/gzh以前的地址替换成http://weixin.qq.com/q/xxx
rewrite ^ http://weixin.qq.com/q/xxx;
}
location /test {
default_type text/html;
return 200 "207_80";
}
location / {
default_type text/html;
#根据规则的执行情况,返回一个状态值给客户端。
return 200 "207_80";
}
location /status
{
#这个模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在编译的时候手动添加编译参数
stub_status on;
#日志
access_log /usr/local/nginx/logs/status.log;
}
location /lua{
default_type text/html;
content_by_lua_file /usr/local/op/code/test.lua;
}
location /comm{
default_type text/html;
if ( $request_uri ~* /comm/gzhqr ) {
content_by_lua_file /usr/local/op/code/redisget.lua;
}
proxy_pass http://192.168.1.209;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server
{
listen 192.168.88.100:8081;
server_name www.cs.cc;
default_type 'text/html';
charset utf-8;
# 日志级别
error_log logs/error.log info;
location /test {
default_type text/html;
return 200 "207_8081";
}
location /luac
{
default_type text/html;
#lua_code_cache off;
#$request_uri就是完整url中刨去最前面$host剩下的部分,比如http://www.baidu.com/pan/beta/test1?fid=3的就是/pan/beta/test1?fid=3
#~* /devc/gzhqr表示含有/devc/gzhqr为true
if ( $request_uri ~* /devc/test ) {
content_by_lua_file /usr/local/op/lualib/tcode/test1.lua;
}
}
location / {
root html;
index index8081.html index8081.htm;
}
}
server {
listen 8085;
listen 443 ssl;
#填写绑定证书的域名
server_name www.cs.cc;
#为服务器启用HTTPS。
#ssl on;
ssl_certificate /usr/local/op/nginx/conf/1_www.cs.cc_bundle.crt;
ssl_certificate_key /usr/local/op/nginx/conf/2_www.cs.cc.key;
ssl_session_timeout 5m;
#指令启用所指示的协议。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#描述了允许的密码。密码以OpenSSL支持的格式分配
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
#要求协议SSLv3和TLSv1服务器密码优先于客户机的密码。
ssl_prefer_server_ciphers on;
charset utf-8;
resolver 114.114.114.114;
#日志级别
error_log logs/error.log info;
#网页
location ~/social_security_homepage.html {
rewrite ^(.*)$ /socialstop.html break;
}
#网络资源路径
location /h5/huo/images/
{
proxy_pass http://192.168.1.209:3000/images/;
}
#地址
location /h5/
{
proxy_pass http://192.168.1.209:3000/;
}
#本地路径
location /upload/file/
{
root /opt/nci/NCI_DOWN/;
}
if ($request_uri ~* /wxapp/sign/)
{
rewrite ^/(.*) http://weixin.qq.com/r/xxx? permanent;
}
#老管理平台图片的重写
if ($request_uri ~* /download/downLoad.do\?loadFile=/ITCT_Mng/image)
{
rewrite ^/(.*) https://www.cs.cc/upload/file$argloadFile? permanent;
}
#管理平台的资源转发
if ($request_uri ~* ^(/PRO_GLPT/))
{
rewrite ^/PRO_GLPT/(.*)$ /glpt/$1 last;
#没有匹配上返回403 状态码为444(此状态码是非标准的),那么直接关闭此TCP连接
#return code
#return code text 因为要带响应内容,因此code不能是具有跳转功能的30x
#return code URL 此时URI可以为URI做内部跳转,也可以是具有“http://”或者“https://”等协议的绝对URL,直接返回客户端,而code是30x(301, 302, 303, 307,308)
#return URL 此时code默认为302,而URL必须是带“http://”等协议的绝对URL
return 403;
}
location /glpt/
{
proxy_pass http://192.168.1.209:8088/PRO_GLPT/;
proxy_redirect http:// https://;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_next_upstream error timeout invalid_header;
}
if ($request_uri ~* ^(/REDIS/))
{
rewrite ^/REDIS/(.*)$ /redis/$1 last;
}
location /gitblit
{
proxy_pass http://192.168.1.209:10101/;
proxy_redirect http:// https://;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_next_upstream error timeout invalid_header;
}
location /luac
{
default_type text/html;
#lua_code_cache off;
if ( $request_uri ~* /devc/gzhqr ) {
content_by_lua_file /usr/local/op/lualib/tcode/gzh_info.lua;
#过期时间30天
expires 30d;
}
}
location /comm
{
default_type text/html;
#设置变量
set $lable 0;
if ($request_uri ~* /main.*/homeinfo) {
set $lable 1;
content_by_lua_file /usr/local/op/lualib/tcode/busi/main/main.lua;
}
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://192.168.1.207:8089/TKB_COMMON;
}
#维护中的页面
location =/stoptaking.html
{
#expires -1;
add_header Cache-Control no-store ;
index stoptaking.html;
}
}
-
关于最大并发数
并发总数是worker_processes
和 worker_connections
的乘积,即
max_clients = worker_processes * worker_connections
在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么,为什么上面反向代理要除以4,应该说是一个经验值,根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:2 * 100000= 200000,worker_connections 值的设置跟物理内存大小有关,因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数,而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右,我们来看看4G内存的VPS可以打开的文件句柄数是多少:,
$ cat /proc/sys/fs/file-max
结果是373519
输出 373519,200000 < 373519,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内,所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置,使得并发总数小于操作系统可以打开的最大文件数目,其实质也就是根据主机的物理CPU和内存进行配置,当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
-
重定向问题
rewrite regex replacement [flag];
rewrite 正则表达式 替换URL 参数
如果rewrite同一个上下文中有多个这样的正则,匹配会依照rewrite指令出现的顺序先后依次进行下去,匹配到一个之后并不会终止,而是继续往下匹配,直到返回最后一个匹配上的为止。如果想要中止继续往下匹配,可以使用第三个参数flag。
列如:
^/PRO_GLPT/(.*)$ /glpt/$1 last
regex:^/PRO_GLPT/(.*)$
replacement /glpt/$1
flag:last
last匹配到之后直接处理,不在匹配上下文中的rewrite,接着用新的URI马上搜寻新的location
break立即停止执行所有当前上下文的rewrite模块指令,break不会搜寻新的location,直接用这个新的URI来处理请求,这样能避免重复rewite。
在server上下文中使用last,而在location上下文中使用break。
如果replacement中包含请求参数,那么默认情况下旧URI中的请求参数也会拼接在replacement后面作为新的URI,如果不想这么做,可以在replacement的最后面加上?。
-
multi_accept
当一个新连接到达时,如果激活了accept_mutex,那么多个Worker将以串行方式来处理,其中有一个Worker会被唤醒,其他的Worker继续保持休眠状态;如果没有激活accept_mutex,那么所有的Worker都会被唤醒,不过只有一个Worker能获取新连接,其它的Worker会重新进入休眠状态,这就是惊群问题。
-
listen格式
sten 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
-
stub_status状态解释
对后端发起的活动连接数
Active connections: 105
server accepts handled requests
#nginx 总共处理了 48509358 个连接, 成功创建 48509358 次握手 (证明中间没有失败的), 总共处理了 50104491 个请求 (平均每次握手处理了 1.03个数据请求)
48509358 48509358 50104491
#Reading:nginx 读取到客户端的Header信息数
#Writing:nginx 返回给客户端的Header信息数
#Waiting:开启 keep-alive 的情况下,这个值等于active - (reading + writing)意思就是Nginx说已经处理完正在等候下一次请求指令的驻留连接
Reading: 0 Writing: 1 Waiting: 103
参考
nginx配置文件nginx.conf超详细讲解
nginx学习随笔
Nginx的accept_mutex配置
Nginx文档
一篇文章说透Nginx的rewrite模块