本文记录 Linux CentOS7 环境安装 Nginx 的基本步骤,最后输出 Linux 上安装服务的通用法则。
读完本文你将收获
在新机器上安装 Nginx 服务,与安装 PHP 服务类似,有两种方式
官方Nginx 下载对应的版本,解压安装
官方资料查看这里Nginx 官方资料
yum安装 官方文档
无论采用哪种方式,都需要在官网确定将要安装的服务版本,确定软件源。
编译安装参数参考
--prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/usr/local/nginx/tmp/client_body --http-proxy-temp-path=/usr/local/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/usr/local/nginx/tmp/uwsgi --http-scgi-temp-path=/usr/local/nginx/tmp/scgi --pid-path=/usr/local/nginx/nginx.pid --lock-path=/usr/local/nginx/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-stream_ssl_preread_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-http_auth_request_module --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module
复制代码
编译过程中,难免缺少必要的组件,缺什么补什么即可。
服务安装后的路径都在配置文件中设置
配置文件/etc 下
运行文件 /usr/local/nginx
日志文件 /var/log/nginx
将一个服务的不同部分分散到不同的位置
这一点是 Linux 上安装服务与 Windows 上安装服务最大的思维不同。
Nginx 中的常用命令
检查配置文件
./nginx -t;
nginx: the configuration file /etc/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/conf/nginx.conf test is successful
复制代码
检查版本
./nginx -v;
nginx version: nginx/1.15.2
复制代码
检查模块
./nginx -V;
nginx version: nginx/1.15.2
复制代码
重启服务
./nginx -s reload
常规配置
Nginx 下 PHP 配置
server {
listen 80;
server_name xx.cn;
index index.php index.html index.htm;
root /data/deploy/xx/backend/web;
location ~* /\. {
deny all;
}
location / {
try_files $uri /index.php?$args;
}
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
client_max_body_size 512m;
}
复制代码
location / {
# Redirect everything that isn't a real file to index.php
try_files $uri $uri/ /index.php$is_args$args;
}
复制代码
参考 nginx try_files
故障排查万能公式
查看 Nginx 运行状态,以及故障,从以下 4 个方面检查
user
error_log
pid
access_log
运行 Nginx 的用户,及权限
查看错误日志输出
pid 是否生成
查看是否有访问日志
对于应用服务的排查,以上 4 个方面是一个万能公式。
技术背景 504
LNMP 环境下,反向代理服务器 Nginx 错误日志大量报错,显示 504
Nginx-504
upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after a period of time,
or established connection failed because connected host has failed to respond) while reading response header from upstream
理论回看
Nginx 504 Gateway Time-out 的含义是所请求的网关没有请求到。
简单来说就是没有请求到可以执行的 PHP-CGI
提交动态请求的时候,Nginx 会直接把 请求转交给 php-fpm。
而 php-fpm 再分配 php-cgi 进程来处理相关的请求。
之后再依次返回,最后由 Nginx 把结果反馈给客户端浏览器。
原因列举如下
Nginx 交由 PHP 处理的任务长时间没有返回,Nginx 直接返回 504。
而这种超时,在 PHP 调用层面的的代码逻辑里很难捕获到,并且习惯上也不捕获,交由框架层面的异常捕获器。
自身服务访问数据库超时不返回或者 PHP 层面业务处理严重耗时。
程序设计不合理,造成长时间延迟超时。
php-fpm fastcgi
问题追踪
如果 PHP 服务出现短时间大量 504 错误,会把整个 fastcgi 通道拥塞堵死。
最后就是 PHP 服务挂了。
服务相互影响
如果多个服务以虚拟主机的形式在同一台服务器上,这多个服务都会受到影响。
最直观的前台体验就是访问速度慢,或者直接打不开。
定时任务,跑批,数据库批量数据更新相关业务容易出这种类型的 Nginx 错误。
网络上通过配置解决 504 的方式,正常情况下不建议使用。
优先考虑程序设计和实现方面的不足,参照我之前的一篇博文 PHP 性能优化之连接超时
安装服务的通用法则
web 应用领域,不管是哪种语言,部署应用程序绕不开 Nginx 服务,本文通过 Nginx 服务的安装,
总结出在 Linux 上安装服务的通用法则
1 确认服务器环境
2 确认待安装服务的安装方式和安装版本
3 确认服务运行账户和相应的配置
4 确认服务正常启动运行
5 优化是否需要自启动
以上同样适用于 Mysql Redis PHP 等服务的安装。
如果有启发,欢迎评论关注,与我交流
评论