968 字
5 分钟
Nginx备忘
常用命令
# 测试配置sudo nginx -t
# 查看完整配置,会把全部include进去,然后输出出来sudo nginx -T
# 重新加载配置nginx -s reload文件结构
以下的都是针对debian系的,他对nginx做了一些魔改,推荐用docker的吧
/etc/nginx/├── nginx.conf # 主配置├── sites-available/ # 可用的站点配置├── sites-enabled/ # 启用的站点(符号链接),只用把available里的配置链接到enable才会启用站点配置。└── conf.d/ # 额外配置
/var/www #这里放网站的静态文件/var/log/nginx #默认这里放日志,当然可以放到你想的地方配置文件
没有主次之分,本质上就一个原生入口在/etc/nginx/nginx.config,但是他可以include从而进行配置的易维护性,debian和nginx官方的关系习惯不尽相同,但是最终区别不大。
下面是docker的nginx的默认配置,与debian的可能不太一样。
user nginx; #nginx父进程在systemd里一般是root权限执行的,这里配置的是他底下的子进程的用户,官方使用nginx用户,debian习惯用www-data,父进程一般是调控底下的子进程的并不处理代理事务worker_processes auto; #自动调整进程数量
error_log /var/log/nginx/error.log notice;pid /run/nginx.pid;
events { worker_connections 1024; #单个进程最大的并发数}
http { include /etc/nginx/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"';
access_log /var/log/nginx/access.log main;
sendfile on; #tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf; #这里代表你可以在这个路径下写http块内部的其他配置,include代表这些配置会被顺序添加在这个位置上。}一般来说有一下几个顶级的配置块
stream块
这个是直接在代理的,只能在传输层把一个socket完全代理到另一个socket,无法端口复用等等应用层的操作。
events块
调整nginx运行性能参数,从刚刚的示例上可以看到worker_connections 1024;
mail块
处理邮件协议,可以代理这些协议:IMAP/POP3/SMTP
http块
web项目最常用的,下面有很多子块,nginx一般会在这个块下面include到conf.d/*.conf,所以我们就可以把站点写到这下面一个服务用一个conf
变量
请求头字段
- X-API-KEY -> $http_x_api_key
- Upgrade -> $http_upgrade
- A_B -> 一般带下划线的字段会被抛弃
- Host -> $http_host
请求参数
比如用户输了:xxxx?id=1,这种url,可以用$arg_id来读出来
nginx自带
- $host:用户输入的主机名,也就是域名
- $remote_addr:远程地址,客户端ip
- $uri:请求路径,不包括参数的
- $scheme
自定义变量
用set定义例如set $xxx "xxx";
map里的变量可以不需要set的
server块
下面是几种常见的用法吧,CORS用nginx来添加性能比直接在后端添加好的多。
server { server_name blog.cannian.space; # nginx托管的静态页面 location / { root /var/www/cannian; index index.html; try_files $uri $uri/ =404; } # 在blog.cannian.space/api下面的会被转发到后端去 location /api/ { rewrite ^/api/(.*)$ /$1 break; #重写路径,你访问的是blog.cannian.space/api/get会变成127.0.0.1:5000/get proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; #用户端写的url proxy_set_header X-Real-IP $remote_addr; #连接的ip proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #也是传递客户端的真实IP地址,因为有时候会套cdn所以单纯的remote_addr不行 proxy_set_header X-Forwarded-Proto $scheme; #传递客户端使用的协议(HTTP/HTTPS) }
listen 443 ssl; ssl_certificate /etc/letsencrypt/live/blog.cannian.space/fullchain.pem; #证书 ssl_certificate_key /etc/letsencrypt/live/blog.cannian.space/privkey.pem; #私钥
}
# HTTP重定向到HTTPSserver { listen 80; server_name blog.cannian.space; return 301 https://$server_name$request_uri;}nginx在面对一个https的请求他无法直接看到请求的host,他会先看TLS里的SNI,判断出在哪个server块里,然后证书解密,判断host再传给后端。
docker
这个docker版的写配置大差不差,但是比传统的avilable-sites方便很多
services: nginx: image: nginx:alpine container_name: nginx ports: - "80:80" volumes: - ./conf.d:/etc/nginx/conf.d:ro