Code is cheap, talk is expensive
main
用于进行 nginx 全局信息的配置events
用于 nginx 工作模式的配置http
用于进行 http 协议信息的一些配置server
用于进行服务器访问信息的配置location
用于进行访问路由的配置upstream
用于进行负载均衡的配置http {}
由 ngx_http_core_module 模块所引入server 模块配置是 http 模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息
location 模块是 nginx 配置中出现最多的一个配置,主要用于配置路由访问信息
在路由访问信息配置中关联到反向代理等各项功能,所以 location 模块也是一个非常重要的配置模块
location [ = | ~ | ~* | ^~ ] uri { ... }
允许根据用户请求的 URI 来匹配定义的各 location;
=
精确匹配检查~
正则表达式模式匹配检查,区分字符大小写;~*
正则表达式模式匹配检查,不区分字符大小写;^~
URI 的前半部匹配,不支持正则表达式;匹配的优先级 =
> ^~
> ~
> ~*
> 不带任何符号的 location
location / { proxy_pass http://localhost:8888; }
以上是最简单的基础配置,详细配置见下。
upstream 模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器
一台主机上运行许多站点,这些站点通过Host
来甄别。因此,通过这种方式配置的站点,称为虚拟主机
server { listen 80 default_server; server_name _; return 444; # 过滤其他域名的请求,返回444状态码 } # 通过反向代理提供服务 server { listen 80; server_name www.aaa.com; # www.aaa.com域名 location / { proxy_pass http://localhost:8080; # 对应端口号8080 } } # 直接通过nginx提供web服务 server { listen 80; server_name www.bbb.com; # www.bbb.com域名 index index.html root /var/www/html }
Nginx 本身不支持 PHP 等语言,但是它可以通过 FastCGI 来将请求扔给某些语言或框架处理(例如 PHP、Python、Perl)。
server { listen 80; location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME /phpFilePath$fastcgi_script_name; # PHP文件路径 fastcgi_pass 127.0.0.1:9000; # PHP-FPM地址和端口号 # 另一种方式: # fastcgi_pass unix:/var/run/php5-fpm.sock; } }
正则 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 $ 匹配字符串的结束 |
? | 重复 0 次或 1 次 {n} 重复 n 次 |
+ | 重复 1 次或更多次 {n,} 重复 n 次或更多次 |
* | 重复 0 次或更多次 [c] 匹配单个字符 c |
\d | 匹配数字 [a-z] 匹配 a-z 小写字母的任意一个 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
{n,} | 重复 n 次或更多次 |
[a-z] | 匹配 a-z 小写字母的任意一个 |
[c] | 匹配单个字符 c |
变量 | 说明 |
---|---|
$args | 这个变量等于请求行中的参数,同$query_string |
$request_filename | 当前请求的文件路径,由 root 或 alias 指令与 URI 请求生成。 |
$scheme | HTTP 方法(如 http,https) |
$request_uri | 包含请求参数的原始 URI,不包含主机名,如:/foo/bar.php?arg=baz |
$uri | 不带请求参数的当前 URI,$uri 不包含主机名,如/foo/bar.html |
$host | 请求主机头字段,否则为服务器名称。 |
$request_method | 客户端请求的动作,通常为 GET 或 POST |
upstream
模块能够使用 3 种负载均衡算法:轮询、IP 哈希、最少连接数。
默认情况下使用轮询算法,不需要配置指令来激活它,它是基于在队列中谁是下一个的原理确保访问均匀地分布到每个上游服务器
通过ip_hash
指令来激活,Nginx 通过 IPv4 地址的前 3 个字节或者整个 IPv6 地址作为哈希键来实现,同一个 IP 地址总是能被映射到同一个上游服务器
通过least_conn
指令来激活,该算法通过选择一个活跃数最少的上游服务器进行连接。如果上游服务器处理能力不同,可以通过给server
配置weight
权重来说明,该算法将考虑到不同服务器的加权最少连接数。
upstream my-server { server 192.168.1.100:8000 weight=2; #轮询权重 server 192.168.1.100:8001 down; # 表示该主机暂停服务 server 192.168.1.100:8002 max_fails=3; # max_fails:表示失败最大次数,超过失败最大次数暂停服务 server 192.168.1.100:8003 fail_timeout=20s; # 表示如果请求受理失败,暂停指定的时间之后重新发起请求 server 192.168.1.100:8004 max_fails=3 fail_timeout=20s; } server { listen 80; server_name localhost; client_max_body_size 1024M; location / { proxy_pass http://my-server; proxy_set_header Host $host:$server_port; } }
上面的 2 种方式都有一个问题,
那就是下一个请求来的时候请求可能分发到另外一个服务器,
当我们的程序不是无状态的时候(采用了 session 保存数据),这时候就有一个很大的很问题了,
比如把登录信息保存到了 session 中,那么跳转到另外一台服务器的时候就需要重新登录了,
所以很多时候我们需要一个客户只访问一个服务器,那么就需要用 iphash 了
iphash 的每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,
可以解决 session 的问题。
upstream test { ip_hash; server localhost:8080; server localhost:8081; }
weight
设置一个服务器的访问权重,数值越高,收到的请求也越多;fail_timeout
在这个指定的时间内服务器必须提供响应,如果在这个时间内没有收到响应,那么服务器将会被标记为 down 状态;max_fails
设置在 fail_timeout 时间之内尝试对一个服务器连接的最大次数,如果超过这个次数,那么服务器将会被标记为 down;down
标记一个服务器不再接受任何请求;backup
一旦其他服务器宕机,那么有该标记的机器将会接收请求。可以放入 http
, server
, location
, limit_except
语句块
deny IP; # 屏蔽单个ip访问 allow IP; # 允许单个ip访问 deny all; # 屏蔽所有ip访问 allow all; # 允许所有ip访问 deny 123.0.0.0/8 # 屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令 deny 124.45.0.0/16 # 屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令 deny 123.45.6.0/24 # 屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令 # 如果你想实现这样的应用,除了几个IP外,其他全部拒绝 allow 1.1.1.1; allow 1.1.1.2; deny all;
permanent
永久性重定向。请求日志中的状态码为 301redirect
临时重定向。请求日志中的状态码为 302server { server_name old_name; return 301 $scheme://new_name$request_uri; }
server { location = /oldpage.html { return 301 http://mydomain.com/newpage.html; } }
server { location /old-dir { rewrite ^/old-dir/(.*) http://mydomain.com/new-dir/$1 permanent; } }
location /static { root /data; expires max; # 不要缓存 # expires -1; }
open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on;
ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
http compression method is not secure in https, opens you up to vulnerabilities like BREACH, CRIME
这个一般给http
使用的。
gzip on; gzip_buffers 16 8k; gzip_comp_level 6; gzip_http_version 1.1; gzip_min_length 256; gzip_proxied any; gzip_vary on; gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml text/javascript application/javascript application/x-javascript text/x-json application/json application/x-web-app-manifest+json text/css text/plain text/x-component font/opentype application/x-font-ttf application/vnd.ms-fontobject image/x-icon; gzip_disable "msie6";
location ~* \.(gif|jpg|png|swf|flv)$ { root html valid_referers none blocked *.nginxcn.com; if ($invalid_referer) { rewrite ^/ www.nginx.cn #return 404; } }
location /img/ { # 访问/img/目录里面的文件时,ningx会自动去/var/www/image/目录找文件 alias /var/www/image/; # alias 是绝对的路径 } location /img/ { # 访问/img/目录下的文件时,nginx会去/var/www/image/img/目录下找文件。] root /var/www/image; # root 指定目录的上级目录 }
location ~ (.git|.gitattributes|.gitignore|.svn) { deny all; }
rewrite ^/(.*)/$ /index.php?/$1 permanent; if (!-d $request_filename){ set $rule_1 1$rule_1; } if (!-f $request_filename){ set $rule_1 2$rule_1; } if ($rule_1 = "21"){ rewrite ^/ /index.php last; }
配置 ssl 需要证书,可以去letsencrypt
申请。
当然,你也可以自己生成证书,只不过浏览器不会信任罢了。
这里不再累述。
# 监听端口,启用http2 listen 443 ssl http2; listen [::]:443 ssl http2; # 启用 session resumption 提高HTTPS性能 # http://vincent.bernat.im/en/blog/2011-ssl-session-reuse-rfc5077.html ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets off; # open dhparam -out dhparam.pem 2048 # ssl_dhparam 未配置,将导致 ssllabs.com 的评分降到 B # 并给 This server supports weak Diffie-Hellman (DH) key exchange parameters. Grade capped to B. 的警告。 # # DHE密码器的Diffie-Hellman参数, 推荐 2048 位 ssl_dhparam /etc/nginx/ssl/dhparam.pem; # 启用服务器端保护, 防止 BEAST 攻击 # http://blog.ivanristic.com/2013/09/is-beast-still-a-threat.html # sl_prefer_server_ciphers on 也是一个必要的配置,否则会 A+ 变成 A-;* # 如果你需要兼容老系统或老浏览器的话,你需要配置 ssl_ciphers,详见 Mozilla Server_Side_TLS 的介绍,Nginx 里面 ssl_ciphers 默认值是 HIGH:!aNULL:!MD5; ref ssl_prefer_server_ciphers on; # 禁用 SSLv3(enabled by default since nginx 0.8.19) since it's less secure then TLS http://en.wikipedia.org/wiki/Secure_Sockets_Layer#SSL_3.0 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ciphers chosen for forward secrecy and compatibility # http://blog.ivanristic.com/2013/08/configuring-apache-nginx-and-openssl-for-forward-secrecy.html ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; # 启用 ocsp stapling (网站可以以隐私保护、可扩展的方式向访客传达证书吊销信息的机制) # http://blog.mozilla.org/security/2013/07/29/ocsp-stapling-in-firefox/ # cloudflare dns resolver 1.1.1.1 1.0.0.1; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/nginx/ssl/cert.pem; # http compression method is not secure in https # opens you up to vulnerabilities like BREACH, CRIME gzip off; # 启用 HSTS(HTTP Strict Transport Security) https://developer.mozilla.org/en-US/docs/Security/HTTP_Strict_Transport_Security # 避免 ssl stripping https://en.wikipedia.org/wiki/SSL_stripping#SSL_stripping # 或 https://hstspreload.org/ add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"; # 验证 SSL # 访问 ssllabs.com 输入你的域名,检查 SSL 的配置是否都正常: # https://ssllabs.com/ssltest/analyze.html?d=xxx.com # 确保验证结果有 A 以上,否则根据提示调整问题 # 配置SSL证书 ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/key.pem;
#定义 Nginx 运行的用户和用户组 user www www; #nginx 进程数,建议设置为等于 CPU 总核心数。 worker_processes 8; #也可以auto #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ] error_log /var/log/nginx/error.log info; # 进程文件 pid /var/run/nginx.pid; #一个 nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值 ulimit -n)与 nginx 进程数相除,但是 nginx 分配请求并不均匀,所以建议与 ulimit -n 的值保持一致。 worker_rlimit_nofile 65535; #工作模式与连接数上限 events { #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; # epoll 模型是 Linux 2.6 以上版本内核中的高性能网络 I/O 模型,如果跑在 FreeBSD 上面,就用 kqueue 模型。 use epoll; #单个进程最大连接数(最大连接数=连接数\*进程数) worker_connections 65535; } #设定 http 服务器 http{ include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型 #charset utf-8; #默认编码 server_names_hash_bucket_size 128; #服务器名字的 hash 表大小 client_header_buffer_size 32k; #上传文件大小限制 large_client_header_buffers 4 64k; #设定请求缓 client_max_body_size 8m; #设定请求缓 #开启高效文件传输模式, # sendfile 指令指定 nginx 是否调用 sendfile 函数来输出文件,对于普通应用设为 on, # 如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off,以平衡磁盘与网络 I/O 处理速度,降低系统的负载。 # 注意:如果图片显示不正常把这个改成 off。 sendfile on; autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。 tcp_nopush on; #防止网络阻塞 tcp_nodelay on; #防止网络阻塞 keepalive_timeout 120; #长连接超时时间,单位是秒 #FastCGI 相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; #gzip 模块设置 gzip on; #开启 gzip 压缩输出 gzip_min_length 1k; #最小压缩文件大小 gzip_buffers 4 16k; #压缩缓冲区 gzip_http_version 1.0; #压缩版本(默认 1.1,前端如果是 squid2.5 请使用 1.0) gzip_comp_level 2; #压缩等级 #压缩类型,默认就已经包含 text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个 warn。 gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; #limit_zone crawler \$binary_remote_addr 10m; #开启限制 IP 连接数的时候需要使用 # upstream 负载均衡 upstream server1 { #upstream 的负载均衡,weight 是权重,可以根据机器配置定义权重。 # weigth 参数表示权值,权值越高被分配到的几率越大。 server 192.168.80.121:80 weight=3; server 192.168.80.122:80 weight=2; server 192.168.80.123:80 weight=3; } #虚拟主机的配置 server{ #监听端口 listen 80; #域名可以有多个,用空格隔开 server_name www.ha97.com ha97.com; index index.html index.htm index.php; root /data/www/ha97; location ~ .*\.(php|php5)?\${ fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } #图片缓存时间设置 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 10d; } #JS和CSS缓存时间设置 location ~ .*\.(js|css)?$ { expires 1h; } #日志格式设定 log_format access '$remote_addr – $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; #定义本虚拟主机的访问日志 access_log /var/log/nginx/access.log access; #对根目录"/" 启用反向代理 location / { proxy_pass http://127.0.0.1:88; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #以下是一些反向代理的配置,可选。 proxy_set_header Host $host; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数, proxy_connect_timeout 90; #nginx 跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers 缓冲区,网页平均在 32k 以下的设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers\*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从 upstream 服务器传 } #设定查看 Nginx 状态的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file conf/htpasswd; #htpasswd 文件的内容可以用 apache 提供的 htpasswd 工具来产生。 } #本地动静分离反向代理配置 #所有 jsp 的页面均交由 tomcat 或 resin 处理 location ~ .(jsp|jspx|do)?$ { 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_pass http://127.0.0.1:8080; } #所有静态文件由 nginx 直接读取不经过 tomcat 或 resin location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)\$ { expires 15d; } location ~ .\_.(js|css)?\${ expires 1h; } } #server } # end http