CentOS中使用Nginx各项配置、注意事项、和遇到的坑
文章就是整理一下本人使用Nginx的过程中遇到的问题、处理方法,有问题的话请指正!文章也会不定时更新!谢谢
选择、下载Nginx
Nginx官网下载传送门
在页面中选择自己需要的版本,一般建议选择Stable version(稳定版),Linux系统下载第二列即可,Windows下载第四列即可,pgp是用来验证的,和使用无关;如果有特殊需求就在Legacy versions(历史版本选择),该文章均以Nginx-1.16.0、CentOS 6说明,不同之处留言说明;
安装Nginx
使用wget或者ftp等方式将安装包存储在服务器中
tar -zxvf nginx-1.16.0.tar.gz
安装依赖环境
默认需要pcre、zlib、ssl、gcc,如果已经安装的就跳过
yum -y install gcc-c++ pcre-devel zlib-devel openssl openssl-devel
Ubuntu就是如下命令
sudo apt-get install -y gcc libpcre3 libpcre3-dev zlib1g-dev openssl libssl-dev
编译Nginx
编译时可以指定安装路径(–prefix=)和配置Nginx需要安装的模块(–with……)
cd nginx-1.16.0
./configure --prefix=/data/local/nginx/ --with-http_gzip_static_module --with-http_ssl_module
更多模块安装方式请看nginx官网的文档http://nginx.org/en/docs/
选择想使用的模块,进入详细页面,复制下图选中部分的内容追加到configure命令后就行
Nginx编译成功后输出大致如下
Configuration summary
+ using system PCRE library
+ using system OpenSSL library // 看是否安装ssl模块,没安这个就是不可用的
+ using system zlib library
nginx path prefix: "/data/local/nginx/"
nginx binary file: "/data/local/nginx//sbin/nginx"
nginx modules path: "/data/local/nginx//modules"
nginx configuration prefix: "/data/local/nginx//conf"
nginx configuration file: "/data/local/nginx//conf/nginx.conf"
nginx pid file: "/data/local/nginx//logs/nginx.pid"
nginx error log file: "/data/local/nginx//logs/error.log"
nginx http access log file: "/data/local/nginx//logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
构建、安装
make
成功后输出大致如下
sed -e "s|%%PREFIX%%|/data/local/nginx/|" \
-e "s|%%PID_PATH%%|/data/local/nginx//logs/nginx.pid|" \
-e "s|%%CONF_PATH%%|/data/local/nginx//conf/nginx.conf|" \
-e "s|%%ERROR_LOG_PATH%%|/data/local/nginx//logs/error.log|" \
< man/nginx.8 > objs/nginx.8
make[1]: Leaving directory `/data/software/nginx/nginx-1.16.0'
然后
make install
成功后输出大致如下
test -d '/data/local/nginx//logs' \
|| mkdir -p '/data/local/nginx//logs'
make[1]: Leaving directory `/data/software/nginx/nginx-1.16.0
检查安装是否成功
到./configure --prefix=配置的路径查看,未指定安装位置就到/usr/local/nginx查看,结构大致如下
drwxr-xr-x 2 root root 4096 Aug 2 16:19 conf // nginx的配置文件存放位置
drwxr-xr-x 2 root root 4096 Aug 2 16:19 html
drwxr-xr-x 2 root root 4096 Aug 2 16:19 logs // nginx日志存放位置
drwxr-xr-x 2 root root 4096 Aug 2 16:19 sbin // nginx运行文件
检查命令
cd sbin
./nginx –v
响应如下即成功:
nginx version: nginx/1.16.0
使用nginx命令如果报错 ./nginx: error while loading shared libraries:libpcre.so.1: cannot open shared object file: No such file or directory
代表该版本的pcre环境库没有关联上,目前最方便的解决方案:
使用sudo ln -s /lib64/libpcre.so.0.0.1 /lib64/libpcre.so.1
此操作是在系统lib库中创建软链接,小心使用
Nginx基本命令
nginx // 启动Nginx
nginx -s stop // 停止Nginx进程
nginx -s reload // 重新加载配置文件
nginx -t // 检查配置文件
nginx -c 相对nginx根目录路径的配置文件路径 // 指定配置文件启动
nginx -V // 查看nginx安装的模块
Nginx安全
出于安全考虑,避免使用root用户启动Nginx,但是这不代表不可用root用户运行,详见如下说明
cd nginx/conf
vim nginx.conf
配置文件第一行默认是 #user nobody
也就是在不指定的情况下,使用root用户运行nginx命令就是root用户运行,如果是普通用户运行nginx命令就是nobody用户运行
但是当将注释去掉之后,例如:创建一个组名nginx中名为nginx的用户
然后将配置文件改为user nginx
无论是-t检查或者nginx启动都会提示警告:
nginx: [warn] the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /infapp/local/nginx/conf/nginx.conf:2
意思是只有使用超级管理员启动时,user的配置才生效,这个时候使用root用户运行nginx命令就是分配给nginx用户运行,如果是普通用户运行nginx命令还是nobody用户运行,因为普通用户运行时,会忽略user配置,所以最好是创建一个用来运行Nginx的专用用户,然后将user配置为该用户,再用root用户启动Nginx
小提示:由于系统限制,如果使用1024以下的端口号就必须使用root用户身份
当使用Nginx时,上传文件偶尔发生500错误响应
这个500的响应,原因有可能会很多,这里排除服务的错误,从Nginx方面描述,所以先确保服务正常运行、可用,然后检查Nginx的日志;
tail -f nginx根目录/logs/error.log
如果这里有如下错误,错误关键字client_body_temp/0000000079
路径的访问权限不足,
2019/10/18 13:26:28 [crit] 5517#0: *6997306 open() "CSDN_Aubrey_J/nginx/client_body_temp/0000000079" failed (13: Permission denied), client: 100.*.*.*, server: 106.*.*.*, request: "POST CSDN_Aubrey_J/upload HTTP/1.1", host: "CSDN_Aubrey_J", referrer: "https://CSDN_Aubrey_J"
说明Nginx的权限不足,client_body_temp该文件夹是在上传时Nginx的缓存目录,如果Nginx的运行用户权限不足不能读写该文件夹就会造成错误响应,解决方案是指定一个有权限读写Nginx目录的用户,并按照上面的安全描述的方式配置、重启Nginx
其他报错信息或者情况还没遇到,遇到的留言描述,看到会及时回复、讨论解决方案
已安装好的Nginx增加模块
1、nginx -s stop
停止Nginx服务
2、进入Nginx安装根目录/sbin,备份原nginx执行文件cp nginx nginx.bak
3、进入Nginx源文件(安装包)目录下,重复上面的安装流程,注意在configure那步把需要的模块添加到编译参数中(包括已安装的模块,不然重新安装后已经安装的就没了),其他正常
4、在make install
之后就可以使用了
SSL配置
SSL配置也就是https访问配置。
我们需要将证书文件上传至服务器的某个路径中(记住这个路径)
然后我们在Nginx配置中修改Sever
内容如下
server {
listen 443 ssl; # 1.1版本后这样写
server_name www.domain.com; #填写绑定证书的域名
ssl_certificate www.domain.com_bundle.crt; # 指定crt证书文件的位置,绝对路径
ssl_certificate_key www.domain.com.key; # key文件绝对路径,同上
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
location / {
// ……其他不变
}
}
重启Nginx服务即可
缓存设置
Nginx可以指定响应的信息是否可以缓存、缓存时间等,建议设置在代理中;
也就是某个代理的请求中,哪些指定的信息做指定的缓存配置,例如VUE的静态资源访问代理
location /platform {
try_files $uri $uri/ /app/index.html last; // 拦截platform、platform/,带/和不带/的URI,重定向到/app/index.html,VUE资源主页面(相对于root的路径下的子路径)
root /project/soft; // 静态资源所在文件夹路径
index index.html index.htm;
if ($request_filename ~* .*\.(?:htm|html)$)
{
// 禁止缓存
add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
}
if ($request_filename ~* .*\.(?:js|css)$)
{
# add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
expires 30m;
}
if ($request_filename ~* .*\.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm)$)
{
# add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
expires 30m; // 缓存30分钟
}
}
代理设置(服务、VUE)
后台服务代理配置
location /mobile {
proxy_pass http://localhost:8080/mobile; // 代理转发地址
proxy_connect_timeout 60; // 连接超时时长
proxy_send_timeout 60; // 请求超时时长
proxy_read_timeout 60; // 响应超时时长
// 以下的配置是防止代理访问失败时,浏览器暴露服务的真实地址
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
VUE静态资源路由代理
location /platform {
try_files $uri $uri/ /app/index.html last; // 拦截platform、platform/,带/和不带/的URI,重定向到/app/index.html,VUE资源主页面(相对于root的路径下的子路径)
root /project/soft; // 静态资源所在文件夹路径
index index.html index.htm;
}
问题:unknown directive “某某配置名” in /usr/local/nginx/conf/nginxconf
就是没加载到相应的模块,按照上面增加模块的方法增加对应的模块,然后重启即可