Skip to main content

nginx基础

· 6 min read
ayanami

配置文件

server 虚拟主机, 根据 {listen, server_name}IP-port或者domain-port对来进行唯一性标识, 可以单项相同, 会匹配另一项转发

location + root, index指定主页等

配置静态页面结束

反向代理: server端请求转发

server {
listen 8001;
server_name any_name;
location / {
<!--truncate--> proxy_pass http://localhost:8088/;
}
}

这样的配置文件将8001的nginx请求转发到 http://localhost:8088/

这样简单的反代丢失了用户真实IP的信息(全变成nginx了)

使用proxy_set_header追加header得到真实IP

server {
listen 8001;
server_name any_name;
location / {
proxy_set_header Host $http_host; # nginx主机IP加端口, $host nginx 主机IP
proxy_set_header X-Real-IP $remote_addr; # Client IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8088/;

}
}

非HTTP代理

  • fastcgi_pass, scgi_pass (多用于PHP)
  • uwsgi_pass (多用于python)
  • memcached_pass 转发到memcached server

location可以使用正则等, 例如

location \.(css|js|png|jpg|gif|ico)

(这是一个静态文件示例)

可以模糊匹配

location ^~ /fonts/ # 所有请求路径以/fonts/开头的

动静分离的nginx反代示例

{
listen 8002;
server_name something.tomcat;

# 动态资源部分, 转发到tomcat服务器
location / {
proxy_set_header Host $http_host; # nginx主机IP加端口, $host nginx 主机IP
proxy_set_header X-Real-IP $remote_addr; # Client IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:8088/;
}

# 静态资源部分, nginx提供比tomcat更好的性能
location \.(css|js|png|jpg|gif|ico){
root /home/www/static;
}

location = /html/ie.html {
root /home/www/static;
}

location = ^~ /fonts/ {
root /home/www/static;
}
}

缓冲与缓存

缓冲:异步网络, response从server交给nginx后就释放链接, 放在nginx的buffer里面, 使得连接的持续时间取决于nginx和server的网速而与复杂的client情况无关

nginx默认启用缓冲

缓存:响应缓存, response缓存在磁盘, 接受request先看缓存有没有, 减少发送给server请求数量

启用缓存:

http {
proxy_cache_path /data/nginx/cache keys_zone=mycache:10m;
server {
proxy_cache mycache;
location / {
proxy_pass http://localhost:8000;
}
}
}

不单独拷贝静态资源的缓存策略

proxy_cache_path /data/nginx/cache keys_zone=static:100m
server {
# ...
location \.(css|js|png|jpg|gif|ico){
proxy_cache static;
# 配置缓存失效时间, 默认不失效
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_valid any 5m;
proxy_pass http://localhost:8000;
}
}

一般动态内容缓存不放nginx, 放redis之类

负载均衡

upstream app {
server localhost:8000;
server localhost:8088;
}
server {
# ...
}
server {
# ...
}

upstream定义一个负载均衡的服务组

默认是轮询(round-robin)机制

upstream app {
least_conn; # 最小连接机制, 将下一个请求发给活动连接最少的server
server localhost:8000;
server localhost:8088;
}
upstream app {
ip_hash; # 保证了同一个ip的请求总是转发到相同服务器
server localhost:8000;
server localhost:8088;
}

也可以加权重

upstream app {
server performance.server weight=3;
server app1.server; # 默认权重1
server app2.server;
}

健康检查

upstream app {
server example.com max_fails=3 fail_timeout=30s;
# 30s内失败超过三次, 将服务器标记为不可用30s
}

自定义hash

upstream app {
hash $request_uri consistent;
server localhost:8000;
server localhost:8088;
}

consistent 启用 ketama 一致哈希算法, 在添加或删除服务器时, 只会重新映射部分key, 最大成都减少缓存失效

https nginx完成https握手可以降低后端握手压力

server {
listen 443 ssl;
server_name name;
ssl_certificate /home/ssl/server.crt;
ssl_certificare /home/ssl/server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5
# 如果有密码
ssl_password_file /home/ssl/cert.pass;
}

优化: ssl握手有不小开销,保持活动连接和重用ssl会话参数可以见底

nginx的session存在工作进程共享并有ssl_session_cache配置的ssl缓存之中, 1M = 4000 Session, 默认5m超时, 可以使用ssl_session_timeout增加

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

反代TCP也行, 例如mysql等

# http
http {
server {
# ...
}
}

# tcp
stream {
server {
# ...
}
}
stream {
upstream {
# ...
server any_server;
keepalive 8; # 连接池空闲连接的数量
}
}

转发和重定向:

转发是server端行为, 可以localhost; 重定向是client端行为, 需要给另一个服务器的ip/domain

nginx的 return rewrite 重定向

将老域名的请求重定向到新域名

server {
listen 80;
listen 443 ssl;
server_name www.old.com old.com;
return 301 $scheme://www.new.com$request_uri;
}

rewrite用于正则替换请求URI的地址

例如用于视频等请求, 先替换, 再重定向

其他指令:

gzip 减少大小, 加大tcp开销

sendfile 消除文件传输的缓冲区开销, 直接写入

location /download {
sendfile on;
tcp_nopush on;
}

error_page指定错误页面

推荐写法:

  • 重复的指令继承父级(提取公共项)

  • 不要将所有请求代理到后端, 缓存/静态目录

  • 使用try_file而不是if -f

  • 保持重写规则简单干净

  • 不要将root配置为/

  • 慎用chmod 777, 用namei -om path显示路径上的所有权限找问题

Loading Comments...