1. Nginx源码安装前的准备工作
作为一名运维工程师,我经常需要在生产环境中部署Nginx服务器。与直接使用包管理器安装相比,源码安装能让我们获得更高的灵活性和性能优化空间。今天我就来详细分享Nginx 1.26.2稳定版的源码安装全过程,包含我在实际工作中积累的各种实用技巧。
1.1 选择合适的Nginx版本
Nginx官网提供了三种版本供下载:
- Mainline version(主线版):包含最新功能,但稳定性可能不如稳定版
- Stable version(稳定版):经过充分测试,生产环境首选
- Legacy versions(旧版):仅用于特殊兼容需求
对于生产环境,我强烈推荐使用稳定版。当前最新的稳定版是1.26.2,这也是本文将要安装的版本。你可以通过以下命令直接下载:
bash复制curl -O https://nginx.org/download/nginx-1.26.2.tar.gz
提示:下载完成后务必验证文件的完整性。我习惯使用sha256sum校验:
bash复制sha256sum nginx-1.26.2.tar.gz然后与官网提供的校验值进行比对。
1.2 系统环境准备
在开始安装前,我们需要确保系统具备编译Nginx所需的环境。根据我的经验,以下是最佳实践:
-
操作系统选择:建议使用CentOS 7/8或RHEL系列,这些系统对Nginx的支持最为成熟。
-
软件包组安装:
bash复制yum -y groupinstall "Development Tools"
yum -y groupinstall "Compatibility Libraries"
- 必备依赖安装:
bash复制yum -y install zlib pcre pcre-devel openssl openssl-devel
这些依赖包的作用分别是:
- zlib:支持gzip压缩
- pcre:支持正则表达式(rewrite模块必需)
- openssl:支持HTTPS加密传输
经验分享:如果是在最小化安装的系统上,建议先安装EPEL仓库:
bash复制yum install epel-release这样可以避免后续依赖缺失的问题。
2. Nginx源码编译与安装
2.1 解压与配置
下载完成后,我们需要解压源码包并进行配置:
bash复制tar -xf nginx-1.26.2.tar.gz
cd nginx-1.26.2
接下来是最关键的配置环节。我推荐使用以下配置参数,这是经过多年实践验证的优化组合:
bash复制./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-pcre
这些参数的含义和选择理由:
-
路径配置:
--prefix:指定安装根目录--sbin-path:nginx可执行文件路径--conf-path:主配置文件路径- 日志和pid文件路径:保持默认即可
-
模块选择:
--with-http_stub_status_module:启用状态监控模块(运维必备)--with-http_ssl_module:支持HTTPS(现代网站必需)--with-http_gzip_static_module:静态文件gzip压缩(提升性能)--with-pcre:正则表达式支持(rewrite规则必需)
避坑指南:如果configure阶段报错,通常是缺少依赖。根据错误信息安装对应的开发包即可。例如报"pcre not found"就安装pcre-devel。
2.2 编译与安装
配置完成后,就可以开始编译了:
bash复制make
make install
编译过程可能需要几分钟,取决于服务器性能。完成后,可以通过以下命令验证安装:
bash复制/usr/local/nginx/sbin/nginx -V
这个命令会显示Nginx的版本信息和编译时使用的参数,确认是否包含了我们需要的模块。
3. Nginx服务管理
3.1 创建systemd服务文件
为了方便管理,我们需要将Nginx设置为系统服务。创建服务文件:
bash复制cat > /etc/systemd/system/nginx.service <<EOF
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/bin/rm -f /usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
然后重新加载systemd配置:
bash复制systemctl daemon-reload
3.2 常用管理命令
现在就可以使用systemctl来管理Nginx服务了:
bash复制# 启动服务
systemctl start nginx
# 停止服务
systemctl stop nginx
# 重启服务
systemctl restart nginx
# 重载配置(不中断服务)
systemctl reload nginx
# 查看状态
systemctl status nginx
# 设置开机启动
systemctl enable nginx
3.3 创建命令行快捷方式
为了方便使用,我建议创建一个符号链接:
bash复制ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
这样就能直接使用nginx命令了:
bash复制# 测试配置文件
nginx -t
# 查看帮助
nginx -h
# 查看版本
nginx -v
4. 安装后的优化与验证
4.1 防火墙配置
如果系统启用了防火墙,需要开放HTTP和HTTPS端口:
bash复制firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
4.2 SELinux配置
在启用SELinux的系统上,可能需要调整策略:
bash复制setsebool -P httpd_can_network_connect 1
4.3 验证安装
最后,我们可以通过以下方式验证Nginx是否正常工作:
- 检查服务状态:
bash复制systemctl status nginx
- 检查监听端口:
bash复制ss -tulnp | grep nginx
- 访问测试页面:
bash复制curl http://localhost
如果一切正常,你应该能看到Nginx的欢迎页面。
5. 常见问题解决
在实际安装过程中,可能会遇到各种问题。以下是我总结的几个常见问题及解决方法:
5.1 端口冲突问题
如果启动时报错"Address already in use",说明80端口被占用。解决方法:
bash复制# 查找占用端口的进程
ss -tulnp | grep :80
# 停止占用进程或修改Nginx监听端口
5.2 权限问题
Nginx默认以nobody用户运行,可能导致权限不足。解决方法:
- 创建专用用户:
bash复制useradd -r -s /sbin/nologin nginx
- 修改配置文件中的user指令:
nginx复制user nginx;
- 调整文件和目录权限:
bash复制chown -R nginx:nginx /usr/local/nginx
5.3 模块缺失问题
如果后续需要添加编译时未包含的模块,需要重新编译:
bash复制# 在原有配置基础上添加新模块
./configure [原有参数] --with-http_new_module
make
# 不要make install,否则会覆盖配置
cp objs/nginx /usr/local/nginx/sbin/nginx
6. 性能优化建议
安装完成后,我通常会进行一些基本的性能优化:
- worker进程数:设置为CPU核心数
nginx复制worker_processes auto;
- 连接数限制:
nginx复制events {
worker_connections 1024;
}
- 启用gzip压缩:
nginx复制gzip on;
gzip_types text/plain text/css application/json application/javascript;
- 静态文件缓存:
nginx复制location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public";
}
这些优化可以显著提升Nginx的性能表现,特别是在高并发场景下。