一、Nginx 简介
Nginx((Engine x))是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。由于它的高性能、稳定性和许多高级功能,Nginx 在网络服务器、反向代理、缓存服务器、负载平衡服务器、安全控制服务器等方面都得到了广泛应用。
二、 Nginx 启动流程
Nginx 的启动流程如下图:
pcre_exec() -头文件regex.h ngx_regex_compile() -头文件ngx_regex.h /* 1. nginx从指定的配置文件或目录中解析出配置,根据解析结果生成对应的配置结构体 */ if (ngx_conf_parse(cf, NULL) != NGX_CONF_OK) { ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "nginx configuration file %s test failed", confParam); return NGX_ERROR; } /* 2.逐一初始化解析后得到的每个模块,添加到全局模块列表中 */ if (ngx_init_modules(cycle) != NGX_OK) { ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "init modules error"); return NGX_ERROR; } /* 3.按顺序执行每个模块的 create_conf() 函数,为每个模块创建一个配置数据结构 */ if (ngx_conf_full_name(cycle, ngx_cycle->conf_file->data, 0) != NGX_OK) { return NGX_ERROR; } if (ngx_open_files(cycle) != NGX_OK) { return NGX_ERROR; } if (ngx_close_listening_sockets(cycle) == NGX_ERROR) { return NGX_ERROR; } /* 4.调用 ngx_init_modules 函数初始化模块 */ if (ngx_init_modules(cycle) != NGX_OK) { return NGX_ERROR; } /* 5.调用 ngx_cycle_init 进行初始化,初始化worker_processes和worker_cpu_affinity */ if (ngx_cycle_init(cycle) != NGX_OK) { return NGX_ERROR; } /* 6.启动 worker 进程,并在 master 进程中循环监控 worker 运行状态 */ if (ngx_master_process_cycle(cycle) != NGX_OK) { return NGX_ERROR; } /* 7.收尾工作,释放申请的资源 */ ngx_destroy_pool(cf->pool); ngx_close_connection(ngx_cycle->connection); return NGX_OK;
三、Nginx 启动失败原因分析
1. 端口被占用
在启动Nginx时,如果你使用的端口被其他程序占用,Nginx 无法打开相应的端口,Nginx 将会启动失败。
2021/10/29 11:42:18 [emerg] 23876#23876: bind() to 0.0.0.0:80 failed (98: Address already in use)
解决方法:
- 修改 Nginx 配置文件中的监听端口
- 查找端口占用进程并将其杀死
2. 配置文件错误
Nginx 的配置文件默认位于 /etc/nginx/nginx.conf,如果在配置文件中有语法错误,它将阻止 Nginx 启动。此时,Nginx 将显示一个警告消息并退出。
nginx: [emerg] "worker_processes" directive is not allowed here in /etc/nginx/nginx.conf:1
解决方法:
- 检查配置文件中的错误并更正
- 使用 Nginx 配置检查器检查语法错误
3. 构建版本与服务器不兼容
如果你的服务器和 Nginx 的构建版本不兼容,Nginx 将无法启动。
nginx: [emerg] module "/usr/lib/nginx/modules/ngx_http_geoip_module.so" version 1012001 instead of 1015002 in /etc/nginx/nginx.conf:28
解决方法:使用与服务器和 Nginx 构建版本兼容的 Nginx 版本
四、 Nginx 启动问题解决方法
1. Docker 启动 Nginx
运行 Nginx Docker 镜像需要使用以下命令:
docker run --name nginx -v <绝对路径>/nginx.conf:/etc/nginx/nginx.conf -v <绝对路径>/logs:/var/log/nginx -d nginx
- 使用 -d 参数来将镜像启动到后台
- 使用 -p 来指定端口
- 使用-v来将主机的配置文件或目录挂载到 Docker 容器
2. 检查端口是否被占用
在启动 Nginx 之前,可以使用以下命令来检查端口是否被占用:
netstat -ano | grep
- 使用 netstat 列出所有占用端口的进程
- 使用 grep 过滤指定端口
3. 检查配置文件
检查 Nginx 的配置文件是否正确是解决启动问题的关键。使用以下命令检查配置文件:
nginx -t
如果出现以下输出,则表示配置文件中没有语法错误。
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
4. 检查 Nginx 安装版本
确保在安装 Nginx 时下载了与您的服务器和架构兼容的正确版本。检查 Nginx 版本的命令如下:
nginx -v
如果 Nginx 未正确安装,则输出将类似于:
nginx: command not found
5. 日志分析
在运行 Nginx 时,它使用日志文件记录活动。在许多情况下,分析日志文件是解决启动问题的关键。Nginx 日志存储在 /var/log/nginx/ 目录下。
解锁启动问题之后,Nginx 就可以正常工作了。您可以使用以下命令停止 Nginx 服务:
nginx -s stop
或者使用以下命令重启服务:
nginx -s reload
在处理 Nginx 启动问题时,始终检查错误日志以诊断任何问题。详细检查配置文件、版本和安装文件有助于解锁此类型的问题。