Nginx常⽤配置及优化安全
⼀个站点配置多个域名
server {
listen      80;
server_name  99;
}
server_name 后跟多个域名即可,多个域名之间⽤空格分隔
⼀个服务配置多个站点
server {
listen      80;
server_name  99;
location / {
root /home/project/pa;
index index.html;
}
}
server {
listen      80;
server_name  99;
location / {
root /home/project/pb;
index index.html;
}
}
server {
listen      80;
server_name  99;
location / {
root /home/project/pc;
index index.html;
}
}
基于Nginx虚拟主机配置实现,Nginx有三种类型的虚拟主机
基于IP的虚拟主机:需要你的服务器上有多个地址,每个站点对应不同的地址,这种⽅式使⽤的⽐较少
基于端⼝的虚拟主机:每个站点对应不同的端⼝,访问的时候使⽤ip:port的⽅式访问,可以修改listen的端⼝来使⽤
基于域名的虚拟主机:使⽤最⼴的⽅式,上边例⼦中就是⽤了基于域名的虚拟主机,前提条件是你有多个域名分别对应每个站
点,server_name填写不同的域名即可
nginx添加账号密码验证
server {
location / {
auth_basic "please input user&passwd";
auth_basic_user_file key/auth.key;
}
}
有很多服务通过nginx访问,但本⾝没有提供账号认证的功能,就可以通过nginx提供的authbase账号密码认证来实现,可以⽤以下脚本来⽣成账号的密码
nginx开启列⽬录
当你想让nginx作为⽂件下载服务器存在时,需要开启nginx列⽬录
server {
location download {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
autoindex_exact_size:为on(默认)时显⽰⽂件的确切⼤⼩,单位是byte;改为off显⽰⽂件⼤概⼤⼩,单位KB或MB或GB
autoindex_localtime:为off(默认)时显⽰的⽂件时间为GMT时间;改为on后,显⽰的⽂件时间为服务器时间
默认当访问列出的txt等⽂件时会在浏览器上显⽰⽂件的内容,如果你想让浏览器直接下载,加上下边的配置
if ($request_filename ~* ^.*?\.(txt|pdf|jpg|png)$) {
add_header Content-Disposition 'attachment';
}
配置默认站点
server {
listen 80 default;
}
当⼀个nginx服务上创建了多个虚拟主机时默认会从上到下查,如果匹配不到虚拟主机则会返回第⼀个虚拟主机的内容,如果你想指定⼀个默认站点时,可以将这个站点的虚拟主机放在配置⽂件中第⼀个虚拟主机的位置,或者在这个站点的虚拟主机上配置listen default
不允许通过IP访问
server {
listen      80 default;
server_name  _;
return      404;
}
可能有⼀些未备案的域名或者你不希望的域名将服务器地址指向了你的服务器,这时候就会对你的站
点造成⼀定的影响,需要禁⽌IP或未配置的域名访问,我们利⽤上边所说的default规则,将默认流量都转到404去
上边这个⽅法⽐较粗暴,当然你也可以配置下所有未配置的地址访问时直接301重定向到你的⽹站去,也能为你的⽹站带来⼀定的流量
server {
rewrite ^/(.*)$ blog.linuxbaodian/$1    permanent;
}
直接返回验证⽂件
location = / {
default_type text/plain;
return 200 'd6296a84657eb275c05c31b10924f6ea';
}
很多时候等程序都需要我们放⼀个txt的⽂件到项⽬⾥以验证项⽬归属,我们可以直接通过上边这种⽅式修改nginx即可,⽆需真正的把⽂件给放到服务器上
nginx配置upstream反向代理
http {
...
upstream tomcats {
server 192.168.106.176 weight=1;
server 192.168.106.177 weight=1;
}
server {
location /blog/ {
proxy_pass tomcats;
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;
}
}
}
location /blog/ {
proxy_pass  192.168.106.135:8181;
}
2. ⽬标地址中带uri(proxy_pass tomcats/,/也是uri),此时新的⽬标url中,匹配的uri部分将会被修改为该参数中的uri。
location /blog/ {
proxy_pass  192.168.106.135:8181/;
}
nginx upstream开启keepalive
upstream tomcat {
server blog.linuxbaodian:8080;
keepalive 1024;
}
server {
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass tomcat;
}
}
nginx在项⽬中⼤多数情况下会作为反向代理使⽤,例如nginx后接tomcat,nginx后接php等,这时我们开启nginx和后端服务之间的keepalive能够减少频繁创建TCP连接造成的资源消耗,配置如上
keepalive:指定每个nginx worker可以保持的最⼤连接数量为1024,默认不设置,即nginx作为client时keepalive未⽣效
proxy_http_version 1.1:开启keepalive要求HTTP协议版本为HTTP 1.1
proxy_set_header Connection "":为了兼容⽼的协议以及防⽌http头中有Connection close导致的keepalive失效,这⾥需要及时清掉HTTP头部的Connection
404⾃动跳转到⾸页
server {
location / {
error_page 404 =  @404page;
}
location @404page {
rewrite  .*  / permanent;
}
}
⽹站出现404页⾯不是特别友好,我们可以通过上边的配置在出现404之后给⾃动跳转到⾸页去
配置Nginx⽀持⾼并发
1、Nginx常规优化
编辑f,修改相关参数进⾏优化。
worker_processes 8;
Nginx 进程数,建议按照CPU数⽬来指定,⼀般为它的倍数 (如,2个四核的CPU计为8)。
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_rlimit_nofile 65535;
这个指令是指当⼀个Nginx 进程打开的最多⽂件描述符数⽬,理论值应该是最多打开⽂
件数(ulimit -n)与nginx 进程数相除,但是Nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持⼀致。现在在linux 2.6内核下开启⽂件打开数为65535,worker_rlimit_nofile就相应应该填写65535。
worker_connections 65535;
每个进程允许的最多连接数,理论上每台nginx 服务器的最⼤连接数为worker_processes*worker_connections
keepalive_timeout 60;
keepalive 超时时间。
client_header_buffer_size 4k;
客户端请求头部的缓冲区⼤⼩,这个可以根据你的系统分页⼤⼩来设置,⼀般⼀个请求头的⼤⼩不会超过1k,不过由于⼀般系统分页都要⼤于1k,所以这⾥设置为分页⼤⼩。
open_file_cache max=65535 inactive=60s;
这个将为打开⽂件指定缓存,默认是没有启⽤的,max 指定缓存数量,建议和打开⽂件数⼀致,inactive 是指经过多长时间⽂件没被请求后删除缓存。
open_file_cache_valid 80s;
这个是指多长时间检查⼀次缓存的有效信息。
open_file_cache_min_uses 1;
open_file_cache 指令中的inactive
参数时间内⽂件的最少使⽤次数,如果超过这个数字,⽂件描述符⼀直是在缓存中打开的,如上例,如果有⼀个⽂件在inactive 时间内⼀次没被使⽤,它将被移除。
2、内核参数的优化
编辑f优化linux内核。
p_max_tw_buckets = 6000
timewait 的数量,默认是180000。
net.ipv4.ip_local_port_range = 1024 65000
允许系统打开的端⼝范围。
p_tw_recycle = 1
启⽤timewait 快速回收。
p_tw_reuse = 1
开启重⽤。允许将TIME-WAIT sockets 重新⽤于新的TCP 连接。
p_syncookies = 1
开启SYN Cookies,当出现SYN 等待队列溢出时,启⽤cookies 来处理。
web 应⽤中listen 函数的backlog 默认会给我们内核参数的somaxconn 限制到128,⽽nginx 定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值。
每个⽹络接⼝接收数据包的速率⽐内核处理这些包的速率快时,允许送到队列的数据包的最⼤数⽬。
p_max_orphans = 262144
系统中最多有多少个TCP 套接字不被关联到任何⼀个⽤户⽂件句柄上。如果超过这个数字,孤⼉连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防⽌简单的DoS 攻击,不能过分依靠它或者⼈为地减⼩这个值,更应该增加这个值(如果增加了内存之后)。
p_max_syn_backlog = 262144
记录的那些尚未收到客户端确认信息的连接请求的最⼤值。对于有128M 内存的系统⽽⾔,缺省值是1024,⼩内存的系统则是128。
p_timestamps = 0nginx 配置文件
时间戳可以避免序列号的卷绕。⼀个1Gbps 的链路肯定会遇到以前⽤过的序列号。时间戳能够让内核接受这种“异常”的数据包。这⾥需要将其关掉。
p_synack_retries = 1
为了打开对端的连接,内核需要发送⼀个SYN 并附带⼀个回应前⾯⼀个SYN 的ACK。也就是所谓三次握⼿中的第⼆次握⼿。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量。
p_syn_retries = 1
在内核放弃建⽴连接之前发送SYN 包的数量。
p_fin_timeout = 1
如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2 状态的时间。对端可以出错并永远
不关闭连接,甚⾄意外当机。缺省值是60 秒。2.2 内核的通常值是180 秒,3你可以按这个设置,但要记住的是,即使你的机器是⼀个轻载的WEB 服务器,也有因为⼤量的死套接字⽽内存溢出的风险,FIN- WAIT-2 的危险性⽐FIN-WAIT-1 要⼩,因为它最多只能吃掉1.5K 内存,但是它们的⽣存期长些。
p_keepalive_time = 30
当keepalive 起⽤的时候,TCP 发送keepalive 消息的频度。缺省是2⼩时。
经过以上优化后,Nginx可⽀持超过5万的并发量。
Nginx安全配置
⽹络上有太多关于Nginx安全配置的⽅法,本⽂根据⾃⼰的实际环境,选择适合⾃⼰的Nginx安全配置策略。
1、删除所有不需要的Nginx模块
直接通过编译Nginx源代码使模块数量最少化。通过限制只允许Web服务器访问模块把风险降到最低。例如,禁⽤SSL和autoindex模块你可以执⾏以下命令:
./configure –without-http_autoindex_module –without-http_ssi_module
make
make install
通过以下命令来查看当编译Nginx服务器时哪个模块能开户或关闭:
./configure –help | less
然后禁⽤你⽤不到的Nginx模块。
2、安装SELinux策略以强化Nginx Web服务器
默认的SELinux不会保护Nginx Web服务器,我这⾥安装和编译保护软件。
安装编译SELinux所需环境⽀持
yum -y install selinux-policy-targeted selinux-policy-devel
下载SELinux策略以强化Nginx Web服务器。
cd /opt
wget ‘downloads.sourceforge/project/selinuxnginx/se-ngix_1_0_?use_mirror=nchc’
解压、编译⽂件
tar -zxvf se-ngix_1_0_
编译⽂件
cd se-ngix_1_0_10/nginx
make
将会输出如下:
Compiling targeted nginx module
/usr/bin/checkmodule: loading policy configuration from p
/usr/bin/checkmodule: policy configuration loaded
/usr/bin/checkmodule: writing binary representation (version 6) to d
Creating targeted nginx.pp policy package
rm d.fc d
安装⽣成的nginx.pp SELinux模块:
/usr/sbin/semodule -i nginx.pp
3、控制缓冲区溢出攻击
编辑f,为所有客户端设置缓冲区的⼤⼩限制。
vim /usr/local/nginx/f
编辑和设置所有客户端缓冲区的⼤⼩限制如下:
## Start: Size Limits & Buffer Overflows ##
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
## END: Size Limits & Buffer Overflows ##
4、控制并发连接
使⽤NginxHttpLimitZone模块来限制指定的会话或者⼀个IP地址的特殊情况下的并发连接。编辑f:
limit_zone slimits $binary_remote_addr 5m;
limit_conn slimits 5;
上⾯表⽰限制每个远程IP地址的客户端同时打开连接不能超过5个。
5、限制可⽤的请求⽅法
GET和POST是互联⽹上最常⽤的⽅法。Web服务器的⽅法被定义在RFC 2616。如果Web服务器不要求启⽤所有可⽤的⽅法,它们应该被禁⽤。下⾯的指令将过滤只允许GET,HEAD和POST⽅法:
## Only allow these request methods ##

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。