nginx配置

配置出错

1
2
3
4
5
6
7
8
9
#重启nginx
nginx -s reload
nginx: [emerg] unexpected "}" in /etc/nginx/nginx.conf:79

#A: 行尾没带分号


#检查修改的nginx.conf配置是否正确
nginx -t

upstream与ip_hash

1
2
3
4
5
6
7
8
9
10
11
# upstream 负载均衡

upstream firstdemo {
# ip_hash 粘性IP 相当一段时间,只会跟第一访问sever
ip_hash;

# 同一个url(也就是同一个资源请求)会到达同一台机器,配合缓存命中
hash $request_uri;
server 39.106.145.33;
server 47.93.6.93;
}

Ip_hash机制缺陷:

  • ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash. Eg: 使用的是squid为最前端.那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流肯定是错乱的
  • 假如nginx后端还有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上,这么算起来,nginx后端只能直接指向应用服务器,或者再搭一人squid,然后指向应用服务器. 最好 的办法是用location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去.

root 和 alias 配置区别

root与alias主要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。

1
2
3
location ~ ^/weblogs/ {
root /data/weblogs/www.ttlsa.com;
}

如果一个请求的URI是/weblogs/httplogs/www.ttlsa.com-access.log时,web服务器将会返回服务器上的/data/weblogs/www.ttlsa.com/weblogs/httplogs/www.ttlsa.com-access.log的文件。
root会根据完整的URI请求来映射,也就是/path/uri
因此,前面的请求映射为path/weblogs/httplogs/www.ttlsa.com-access.log。

1
2
3
location ^~ /binapp/ { 
alias /data/statics/bin/apps/;
}

alias会把location后面配置的路径丢弃掉,把当前匹配到的目录指向到指定的目录。如果一个请求的URI是/binapp/a.ttlsa.com/favicon时,web服务器将会返回服务器上的/data/statics/bin/apps/a.ttlsa.com/favicon.jgp的文件。

[warning]

  1. 使用alias时,目录名后面一定要加”/“。
  2. alias可以指定任何名称。
  3. alias在使用正则匹配时,必须捕捉要匹配的内容并在指定的内容处使用。
  4. alias只能位于location块中。

一般情况下,在location /中配置root,在location /other中配置alias。

常规示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 443 ssl;
server_name www.mqiy.xyz;


ssl_certificate /opt/doc/ssl/mqiy.pem;
ssl_certificate_key /opt/doc/ssl/mqiy.key;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

client_max_body_size 50m;

location /image/{
alias /opt/doc/image/;
}
location / {
proxy_pass http://127.0.0.1:4000/;
}
}

nginx用户认证配置

ngx_http_auth_basic_module模块实现让只有输入正确的用户密码才允许访问web内容。默认nginx已安装该模块

修改nginx配置

在server下添加下面两行
server {
auth_basic “Please input password”; #这个是提示信息
auth_basic_user_file /opt/doc/htpasswd;
}

/opt/doc/htpasswd 文件是配置的用户名与密码,是通过htpasswd软件生成

生成授权用户文件

1
2
3
4
5
6
7
8
# 安装httpd
yum -y install httpd

# 生成用户密码文件
htpasswd -cb /opt/doc/htpasswd chris xue84feng

#设置权限(可选)
chmod 400 /opt/doc/htpasswd

重启nginx

nginx配置报错:server directive is not allowed here in /usr/local/nginx/conf/nginx.conf

最终看了nginx.conf配置后,问题原因是:新配置应该放在/etc/nginx/conf.d目录(conf.d是默认目录,具体是哪个目录请根据server配置块之外的include文件位置来确定)。

在/etc/nginx/nginx.conf文件里:

include /etc/nginx/default.d/*.conf这一行配置已经是在server配置块里了,不能再嵌套一层server了。