Nginx安装和遇到过的坑

安装

1.上传安装包nginx-1.15.8.tar.gz,openssl-1.1.0g.tar.gz,pcre-8.38.tar.gz,zlib-1.2.8.tar.gz到/usr/local/src目录下

2.解压安装包,命令:

tar xvzf nginx-1.15.8.tar.gz

tar xvzf openssl-1.1.0g.tar.gz

tar xvzf pcre-8.38.tar.gz

tar xvzf zlib-1.2.8.tar.gz

3.进入nginx解压目录,配置nginx模块,编译安装,命令:

cd nginx-1.15.8

./configure --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8 --with-openssl=../openssl-1.1.0g --with-http_ssl_module --with-http_realip_module --with-http_sub_module

make

make install

4.创建/usr/local/nginx/ssl目录,拷贝secret.key文件和secret.crt文件到此目录下

5.拷贝nginx配置文件到/usr/local/nginx/conf目录下,修改转发配置然后启动

遇到过的坑

针对分用户下nginx上传文件失败的问题做了日志分析和实验得到结论:

一、知识前提:

  1.nginx 的http{ } 层 的 client_body_buffer_size 配置 是nginx请求体的大小缓存设置,他可以是全局变量的也可以是局部的变量。

  知识来源:https://blog.csdn.net/wangbin_0729/article/details/82109693

  2.重点 :client_body_buffer_size 不存在时默认为128k或者更小 ;请求体小于该配置则使用内存存放数据,大于该配置则使用临时目录存放数据(临时目录为/client_body_temp/)

  知识来源:http://www.guodongkeji.com/newsshow-25-3046-1.html

  3.分用户下nginx生成的临时目录/client_body_temp/的权限为nobody (造成的原因在后面会提到) ,该目录只有root用户有绝对的访问权限,当分用户aweb访问该目录时会收到拒绝访问的警告。

二、分析原因:

  当通过nginx上传录音文件时,录音文件以post请求的请求体形式传到nginx服务器,但是录音文件大小超过了client_body_buffer_size,nginx需要启用临时文件目录/client_body_temp/,而使用了分用户的nginx进程没有访问此目录权限,导致上传文件失败。(通过日志分析得到

三、解决方案:

  1.赋予/client_body_temp/ aweb:ucc权限 优缺点:可以不用设置client_body_buffer_size,文件上传对内存消耗小。但是麻烦容易忘记。

  2.设置client_body_buffer_size 50M(按照需要设置,考虑清楚要上传文件的最大文件的大小可能值)

  优缺点:将设置归到nginx设置里面去简单易记。但是每次上传文件均要使用内存来缓存数据,增加了对内存的消耗,文件上传请求高并发下内存可能撑不住。

针对分用户下nginx试听录音文件失败的问题做了日志分析和实验得到初步结论:

一、知识前提:

  1.location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|properties|wav)$ { root /home/aweb/web/WebContent; expires 7d;}配置会把所有带.wav请求指向/home/aweb/web/WebContent/任意字符串.wav 的资源

  2.location /fileServer/ { alias /home/aweb/s/; }会将带/fileServer/的请求 指向 /home/aweb/s/任意资源文件 。

二、分析原因:

  以上2个配置存在一个逻辑上的bug就是当请求中即带有/fileServer/又带.wav文件时,请求到底指向哪里,根据实验发现指向了/home/aweb/web/WebContent/任意字符串.wav,而此路径不是正确的录音文件所在路径。

三、解决方案:

  1.去掉location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|properties|wav)$ { root /home/aweb/web/WebContent; expires 7d;}中的|wav。

  优缺点:请求录音文件直接指向了nginx服务器的所在路径。缺点是去掉|wav后可能会导其他一些带.wav不带/fileServer的请求无法指向/home/aweb/web/WebContent/任意字符串.wav的资源。

  2.将location /fileServer/ { alias /home/aweb/s/; }替换成 location ~ /fileServer { proxy_pass http://web;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";client_max_body_size 1000m;}

  优缺点:所有的带/fileServer/请求反向代理到web, 轮询该配置里面的服务器地址upstream web{server172.16.7.17:8082 ;server172.16.7.18:8082 ; keepalive 200;}实际访问的资源是tomcat所在服务器的资源。

补充说明关于分用户的一点要注意的问题:

一、关于nginx

  1.当nginx是分用户时,若在root用户下执行nginx -t 会将nginx中部分目录的权限(如:proxy_temp)变成 nobody用户导致nginx的读写权限出现error报错。

  2.目前不清楚其他的不当操作是否也会造成目录权限的变化,因此在平时执行命令时请多关注一下nginx中的目录权限是否发生改变。

二、解决方案

  1.若要使用分用户部署nginx,所有命令均在分用户下执行,防止出现文件目录权限发生变化。

  2.对nginx目录执行 chown 用户名:组名 -R nginx/ 命令,将nginx即其以下所有目录权限强制转换为分用户的权限。

后续跟踪:

  1.目前分用户部署存在一些坑,redis和tomcat可能也会存在同nginx类似的权限问题,若有发现请重视反馈排查原因。

  2.对于分用户部署下的nginx,需要有针对上面2个问题综合整理出一个合理的解决方案。