Nginx架构
常见的问题
多个server_name中虚拟主机读取的优先级
相同server_name多个虚拟主机优先级访问:
示例配置文件:
server {
listen 80;
server_name testserver1 www.diwuqingrou.cn;
location / {
root /usr/share/nginx/html/name1;
index index.html index.htm;
}
error_page 500 502 503 504 404 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name testserver2 www.diwuqingrou.cn;
location / {
root /usr/share/nginx/html/name2;
index index.html index.htm;
}
error_page 500 502 503 504 404 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name testserver3 www.diwuqingrou.cn;
location / {
root /usr/share/nginx/html/name3;
index index.html index.htm;
}
error_page 500 502 503 504 404 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Nginx会使用最先读取到的那个配置文件,这里会访问server1,若是删除server1则会访问server2.
location匹配优先级
- = 进行普通字符精确匹配,也就是完全匹配(lv1)
- ^~ 表示普通字符匹配,使用前缀匹配 (lv2)
- ~ \ ~* 表示执行一个正则匹配() (lv3)
server {
listen 80;
server_name localhost ;
root /usr/share/nginx/html;
#匹配 =,精确匹配
location = /user1/ {
rewrite ^(.*)$ /user1/index.html break;
}
#匹配一个正则
location ~ /user.* {
rewrite ^(.*)$ /user2/index.html break;
}
#匹配开头
location ^~ /user {
rewrite ^(.*)$ /user3/index.html break;
}
error_page 500 502 503 504 404 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
当我们访问/user1时,优先匹配 user1,注释user1,再访问时,则会匹配到user3,注释user3,最后才会匹配到user2.
try_files 的使用
按顺序检查文件是否存在
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
try_files $uri $uri/ @java_page;
}
location @java_page{
proxy_pass http://127.0.0.1:8080/;
}
error_page 500 502 503 504 404 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
首先判断/usr/share/nginx/html u r i 是 否 存 在 , 若 不 存 在 , 则 判 断 / u s r / s h a r e / n g i n x / h t m l uri 是否存在,若不存在,则判断/usr/share/nginx/html uri是否存在,若不存在,则判断/usr/share/nginx/htmluri/存不存在,若都不存在则访问http://127.0.0.1:8080/。
alias和root的区别
location /images/png/ {
root /usr/share/nginx/html;
}
若请求http://localhost/images/png/web.png,则实际上请求的是/usr/share/nginx/html/images/png/web.png。
location /images/png/ {
alias /usr/share/nginx/html;
}
若请求http://localhost/images/png/web.png,则实际上请求的是/usr/share/nginx/html/web.png。
传递用户的真实IP
当用户请求后端经过多层代理时,在第一层代理设置参数set x_real_ip=$remote_addr,然后在后端服务这里获取这个 $x_real_ip,这样就能获取到经过多层代理后的用户IP。
Nginx常见的错误码
- 413 request entity too large (用户上传文件限制)
- 502 bad gateway(后端服务无响应)
- 504 gateway time-out(后端服务执行超时)
Nginx的性能优化
-
性能优化考虑点
-
当前系统结构瓶颈
观察指标,压力测试
-
了解业务模式
接口业务类型,系统层次化结构
-
性能与安全
-
-
压力测试工具apache bench
-
系统与Nginx性能优化
- 网络
- 系统
- 服务
- 程序
- 数据库,底层服务
具体的设置:
- 文件句柄
- 修改系统的nofile,即修改配置文件
- 修改nginx进程的,设置worker_rlimit_nofile
- CPU亲和
- 设置worker_processes
- 设置worker_cpu_affinity
user nginx;
worker_processes 16;
#worker_cpu_affinity 0000000000000010 0000000000000010 0000000000000100 0000000000001000 0000000000010000 0000000000100000 0000000001000000 0000000010000000 0000000100000000 0000001000000000 0000010000000000 0000100000000000 0001000000000000 0010000000000000 0100000000000000 1000000000000000;
#worker_cpu_affinity 1010101010101010 0101010101010101;
worker_cpu_affinity auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
worker_rlimit_nofile 35535;
events {
use epoll;
worker_connections 10240;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
#######
#Charset
charset utf-8;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_uri"';
access_log /var/log/nginx/access.log main;
#######
#Core modlue
sendfile on;
#tcp_nopush on;
#tcp_nodeny on;
keepalive_timeout 65;
########
#Gzip module
gzip on;
gzip_disable "MSIE [1-6]\.";
gzip_http_version 1.1;
########
#Virtal Server
include /etc/nginx/conf.d/*.conf;
}
Nginx的安全控制
常见的恶意行为
爬虫行为和恶意抓取,资源盗用
- 可以使用基础的防盗链
- secure_link_module
- access_module
常见的应用层攻击手段
- 暴力破解
- SQL注入
- 文件上传
- XSS