Nginx用起来比Apache方便简介,也有很多超过Apache的地方。Nginx不仅可以作为http服务器来用,更重要的,它还可以用来做负载均衡和反向代理。Nginx官方文档
- 正向代理:类似fq,服务器代替我们去访问其他的服务
- 反向代理:外部访问内部服务,例如外部用户访问公司内部的各个服务,通过一个nginx进行代理
安装nginx
安装方法见: nginx安装方法
如果要安装最新稳定版nginx,可以添加这个源:
1 | [nginx] |
配置文件详解
fastcgi
和http
的区别是,前者是一个二进制协议,并且是长连接,http不是长连接。
nginx配置文件地址在/etc/nginx/nginx.conf
,nginx的配置文件里,最重要的section是http区块,里面包含了全局设置、主机设置(server)、上游服务器设置(upstream)、URL设置
1 | user www-data; # nginx所属用户 |
负载均衡配置
1 | # 在http里定义upstream |
端口转发配置
1 | 在server里: |
单独的虚拟目录配置
最好将单独的域名放到单独的配置文件中/etc/nginx/conf.d/test.conf
1 | server{ |
Rewrite规则
是一种以正则方式重写url的语法。
有如下几种重写类型:
- last: 表示完成rewrite,浏览器地址栏URL不变。一般用在server和if中。不会终止匹配,新的url会重新从server匹配一遍。
- break: 本条规则匹配完成后终止匹配,不再匹配后面的规则,浏览器地址栏URL不变。一般用在location中,会终止匹配,只会往下走,不会整个server重新匹配。
- redirect: 返回302临时重定向,浏览器地址栏URL变成转换后的地址
- permanent: 返回301永久重定向,浏览器地址栏URL变成转换后的地址
1 | # 如果用户访问/test/abc,直接重定向到/abc并且使用test这个upstream |
配置nginx IP黑白名单
新建配置文件/etc/nginx/blockips.conf
,内容格式如下
1 | deny 1.1.1.1; # 屏蔽单个IP |
然后在nginx主配置文件/etc/nginx/nginx.conf
的http
中导入该文件include blockips.conf;
HTTPS证书配置
1 | server { |
查看负载均衡状态
nginx提供了默认的模块可以查看负载均衡的统计信息等,只需要在某个server里面添加:
1 | location /nginx { |
其中htpasswd是保存用户名和密码的文件,可以自定义位置,每一行一个用户username:password
这样子保存的,使用crypt3(BASE64)加密,可以用一个PHP文件来生成
$password = 'hehe';
$password = crypt($password, base64_encode($password));
echo $password;
最后访问 http://...../nginx 即可看到如下的负载均衡信息:
Active connections: 1
server accepts handled requests
2 2 37
Reading: 0 Writing: 1 Waiting: 0
常用模块
nginx-http-concat: 合并前端资源
前端可以直接访问/js/??jquery.js,index.js,second.js
同时获取三个js文件,而不用发送三个请求了
TroubleShooting
CentOS下出现负载均衡出现错误:(13: Permission denied) while connecting to upstream:[nginx],直接执行如下命令:
1
2sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx
sudo semodule -i mynginx.pp # 貌似在SELinux下,auditallowk可以讲禁止的规则加入到信任php-fpm
没有打印错误日志,仅仅有访问日志,原因是php-fpm默认是关闭workder进程的错误输出,重定向到了/dev/null
,所以在errlog里面看不到我们想看的日志,需要做以下更改:1
2
3
4
5
6
7
8vim /etc/php-fpm.conf
[www]
catch_workers_output = yes # 更改为yes
vim /etc/php.ini
log_errors = On
error_log = /var/log/error_log
error_reporting=E_ALLHTTP Header中后端服务无法获取有下划线的header: 没错,无论是
Nginx
还是Apache
,都是不允许的(在HTTP标准中倒是允许的),因为Nginx
的配置文件中的变量都是下划线的,容易引起混淆,当然也可以用underscores_in_headers on
参数进行开启,不过不建议。client intended to send too large body: 客户端发送的数据量太大,可以通过更改
http
模块中的client_max_body_size 1m;
参数,默认为1m
,看实际需要调整upstream sent too big header while reading response header from upstream: 原因是
upstream
那边响应头过大,可以在server/location
配置里面适当加大响应缓存大小:1
2fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;Nginx报错504 gateway timeout: 首先当然是看业务是否需要那么长的时间,如果实在需要,可以在nginx配置中修改如下参数:
1
2
3
4
5
6
7
8
9fastcgi模式
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
proxy模式
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;