nginx 配置,也写了好多次了,这里做个总结。
web服务器,nginx 和 apache,选择nginx
负载均衡
主要分两部分,传输层和应用层
传输层,硬件分离
应用层。端口分离
补充知识
软链接
ln -s 创建软连接。创建软连接。类似于 windows里的快捷方式。
语法
ln -s 源文件 目标文件
- ln link的意思
- -s 是 symbolic 的意思
链接的文件,是同步的,你在哪里修改都会同步生效。
链接,也分为软连接和硬连接。区别是带不带 -s
eg:
ln -s /home/fa/Desktop /mnt/c/Users/Otto/Desktop
这样 后者的文件是前者的映射。
通过 ln --help
来查看帮助。取消链接,删除目标文件
如果访问页面全是错误,可以修改 chomod -R 755 /var/www
安装
mac
brew install nginx
sudo vi /usr/local/etc/nginx/nginx.conf
nginx #启动
brew services start nginx # 作为服务启动
略。
常用命令
启动nginx
nginx
查看是否在运行
ps aux | grep nginx
一般来说,会有两个进程:
- master process 负责调度
- worker process 负责工作
如果配置较多,worker process会多。
退出 nginx
nginx -s stop
快速关闭,相当于杀掉进程nginx -s quit
优雅退出,等到请求关闭后才关闭。
推荐 quit 比较平滑
另一种方法。忽略就可以:
kill -INT cat /var/run/nginx.pid`` 对应 nignx -s stop
kill -QUIT cat /var/run/nginx.pid`` 对应 nginx -s quit
nginx 进程号
cat /var/run/nginx.pid
得到运行中的nginx 进程号,和 ps aux | grep nginx
获取的一样。
生效最新配置
nginx -s reload
重启生效。
对应 kill -HUP cat /var/run/nginx.pid
重读日志文件
备份日志时候,把接下来的日志文件写入新文件
nginx -s reopen
平滑改变日志。对应 kill -USR1 进程号
不停机平滑升级 nginx
kill -USR2 进程号
几乎用不到
检查 配置文件
nginx -t
如果报错,需要加 sudo
端口号小于1024的需要root权限
配置文件
主配置文件在 /etc/nginx/nginx.conf
文章末尾一般会引用其他文件,比如include /etc/nginx/site-enabled/*
sites-availabel 和 sites-enabled 区别
主配置文件一般引用的是 enabled文件夹,所以enabled文件生效
一般通过 ln -s sites-available/default sites-enabled/default
软连接
也可以设置为 disabled 文件夹为不用的配置。
模块
包含了喜闻乐见的反向代理、负载均衡
main全局设置
- user www-data; # 指定 Worker 进程的运行用户以及用户组,默认
- worker_processes auto; # nginx要开启的worker进程数。最优值有很多因素,不能确定时候使用auto
- pid /run/nginx.pid; # 记录pid进程的存储文件位置。查找进程号
- include /etc/nginx/modules-enabled/*.conf; # 配置文件
events 事件设置
- worker_connections 768; # 每个worker进程能并发处理的最大连接数
- multi_accept on;
- 这里会有个最有计算公式。我复制如下。
worker_connections 设置每个 Worker 进程能并发处理的最大连接数。
最大客户端连接数由 worker_processes和 worker_connections 决定:
Nginx 作为 HTTP 服务器时,Max_clients = worker_processes worker_connections;
Nginx 作为反向代理时,Max_clients = worker_processes worker_connections / 4。
http 服务器设置
基础设置
了解即可。
- sendfile on; # 是否开启高效传输模式。
- tcp_nopush on; # 防止网络阻塞
- tcp_nodelay on; # 防止网络阻塞
- keepalive_timeout 65; # 客户端保持活动的超时时间,超出服务器会关闭该链接
- types_hash_max_size 2048;
- #server_tokens off;
- #server_names_hash_bucket_size 64;
- #server_name_in_redirect off;
- include /etc/nginx/mime.types; # 加载 mime.types 用于帮助 nginx 识别文件的 mime 类型
- default_type application/octet-stream; # 文件默认 mime 类型,例如如果没有配置 asp 环境,ng 不解析,此时浏览器访问 asp 会下载。
SSL 设置
了解即可。具体的HTPPS会讲
登录设置
日志地址
- access_log /var/log/nginx/access.log; # access_log 地址
- error_log /var/log/nginx/errorl.log;
Gzip 设置
- gzip on; # 开启 gzip 将大大减少发送的数据量,一定要开。
- #gzip_vary on;
- #gzip_proxied any;
- #gzip_comp_level 6;
server 虚拟机设置 重点!
- listen 80 default_server; # 监听80端口
- listen [::]:80 default_server;
- autoindex on;
- autoindex_exact_size off;
- autoindex
SSL 配置
- #listen 443 ssl default_server;
- #listen [::]:443 ssl default_server;
- root /var/www/html; # 虚拟主机根目录
- index index.html index.php
- error_page 404 /404.html;
- server_name _; # 设置域名 localhost xxx.com
- location / {try_files $url $url/ =404;}
location URL匹配设置
匹配规则
- 记住一个规则 location ^~ /img {} 这个符号会让规则前提。
- =精确匹配
- ^~ 提高前缀字符串匹配优先级
- ~ 区分大小写的正则匹配
- ~* 不区分大小写的正则
- / 通用匹配
反向代理 推荐
如果想把一个请求(反向代理)给http代理服务器,需要在Location模块中指定proxy_pass指令。
发送请求 127.0.0.1:80 ==> www.a.com
server{
listen 80;
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_redirect off;
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 指令可以改变请求头字段的值。
该指令可以在 location 块或更高级的块中指定,比如 server 或 http。
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 后端服务器可以通过这个获取用户真实ip
- proxy_set_header Accept-Encoding "";
- proxy_pass http://localhost:8000;
upstream 负载均衡
https://segmentfault.com/a/1190000014057523
http 里面
分配方式5中:
- 轮询,默认
按照请求时间顺序分配
upstream jochen {
server 192.168.4.221:80;
server 192.168.4.222:80;
}
- weight 权重比例
upstream jochen {
server 192.168.4.221:80 weight=10;
server 192.168.4.222:80 weight=20;
}
- ip_hash
upstream jochen {
server 192.168.4.221:80;
server 192.168.4.222:80;
ip_hash;
}
健康检查
需要安装模块