官网地址:https://nginx.org/
开源地址:https://github.com/nginx/nginx
一、Nginx概念
Nginx是一款开源的高性能Web服务器和反向代理服务器,常用于处理静态内容和负载均衡。它支持多种协议,如HTTP、HTTPS和SMTP,能够高效处理大量并发连接,适合高流量的网站。
Nginx的主要功能包括:
- 反向代理:可以将请求转发到后端服务器,负载均衡,提高网站性能和可用性。
- 静态文件服务:高效处理静态内容,如图片、CSS和JavaScript文件,减少服务器负担。
- 负载均衡:支持多种负载均衡算法(如轮询、最少连接等),帮助分散流量。
- SSL/TLS支持:提供安全的HTTPS服务,保障数据传输安全。
- 高并发处理:使用事件驱动架构,能够同时处理成千上万的连接,适合大规模应用。
二、安装Nginx
这里以安装 1.21.6 版本为例。
1.下载并解压nginx源码包
安装构建工具和依赖项:
yum install -y wget make gcc gcc-c++ pcre-devel openssl-devel geoip-devel zlib-devel
下载 nginx 源码包并解压:
cd /usr/local/src
wget http://nginx.org/download/nginx-1.21.6.tar.gz
tar -zxvf nginx-1.21.6.tar.gz
cd nginx-1.21.6
2.创建nginx用户
创建了一个名为 nginx
的用户,并将其登录 shell 设置为 /sbin/nologin
,即无法登录系统,主要用于编译安装 nginx:
useradd -r -s /sbin/nologin -M nginx
3.编译并安装nginx
在编译OpenSSL时,指定安装路径,这里安装到/usr/local/nginx
:
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-compat \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-stream_geoip_module \
--with-mail \
--with-mail_ssl_module
开始编译nginx
源码并安装nginx
:
make -j $(nproc)
make install
4.验证nginx版本
进入nginx安装目录,执行以下命令验证:
cd /usr/local/nginx
./sbin/nginx -V
# 显示版本信息
nginx version: nginx/1.21.6
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_geoip_module --with-mail --with-mail_ssl_module
5.临时启动Nginx
/usr/local/nginx/sbin/nginx -t # 检查配置文件是否正确
/usr/local/nginx/sbin/nginx # 启动 Nginx
/usr/local/nginx/sbin/nginx -s quit # 优雅地停止 Nginx,然后手动启动
/usr/local/nginx/sbin/nginx -s reload # 重载nginx
# 如创建了软链接则可以使用软连接启动 ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
/usr/bin/nginx -s quit # 优雅地停止 Nginx,然后手动启动
/usr/bin/nginx # 启动 Nginx
/usr/bin/nginx -s reload # 先尝试重载配置,如果失败再重新启动
/usr/bin/nginx -t # 检查配置文件是否正确
三、配置Nginx
1.创建nginx软链接
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
2.修改nginx配置文件
在 Nginx 安装目录的 conf
目录中,nginx.conf
是 Nginx 的主配置文件,这里以基础的配置文件内容参考为例:
cat > /usr/local/nginx/conf/nginx.conf <<'EOF'
user nginx;
worker_processes auto;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
error_log logs/error.log;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
server_tokens off;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
include conf.d/*.conf;
}
EOF
**注:**如果默认端口被占用,修改其他端口即可。
解释说明:
worker_processes auto
:自动设置工作进程数。worker_connections 1024
:每个工作进程最大连接数。include mime.types
:包含MIME类型。default_type application/octet-stream
:默认类型。sendfile on
:启用高效文件传输tcp_nopush on
:优化TCP传输tcp_nodelay on
:禁用延迟keepalive_timeout 65
:长连接超时时间。gzip on
:启用gzip压缩。gzip_types ......
:压缩的MIME类型。
这里配置完成后,如果直接重载 nginx,会报错:
# 校验配置文件语法
nginx -t
# 重载nginx
nginx -s reload
# 显示报错信息如下
nginx: [error] invalid PID number "" in "/var/run/nginx.pid"
由于配置了 include conf.d/*.conf
,因此需要在 Nginx 安装目录下的 conf
目录中创建对应的 conf.d
目录,主要存放于独立的配置文件信息:
mkdir -p /usr/local/nginx/conf/conf.d
3.配置启动服务
创建一个名为 nginx.service
的 systemd 服务单元文件,用于管理 Nginx 服务,存放于/etc/systemd/system
目录下,并添加以下内容:
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
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
服务单元文件配置详解:
这是一个
systemd
服务单元文件,用于管理和配置 Nginx 服务。systemd
是一个 Linux 系统的初始化系统和服务管理器,它管理和配置系统启动后运行的服务。这个文件的主要部分包括Unit
、Service
和Install
。
[Unit]
部分包含了服务的描述和依赖关系:
Description
:服务的描述,这里是 “The NGINX HTTP and reverse proxy server”。After
:这个指定了服务的启动顺序。这里,Nginx 会在network.target
(网络服务)、remote-fs.target
(远程文件系统)和nss-lookup.target
(名字服务解析)之后启动。[Service]
部分定义了服务的启动、停止和重载的命令以及其他相关设置:
Type=forking
:这意味着这个服务会创建一个或多个子进程。ExecStart
:启动服务的命令。ExecReload
:重新加载服务的命令。ExecStop
:停止服务的命令。PrivateTmp=true
:这是一个安全选项,如果设置为true
,则此服务将有一个独立的临时目录,与其他服务和用户隔离。[Install]
部分用于定义如何 ‘安装’ 这个服务:
WantedBy
:这个指定了哪个目标需要这个服务。这里,multi-user.target
是一个常见的目标,它表示多用户环境。
4.启动nginx服务
配置完成后,启动Nginx服务:
systemctl start nginx
# 查看Nginx服务状态
systemctl status nginx
# 设置开机自启服务
systemctl enable nginx
# 重启服务
systemctl restart nginx
四、访问Nginx
浏览器访问 http://<IP>
,会显示 Nginx 的默认欢迎页面:

五、使用nginx
1.配置nginx反向代理示例
假设需要配置一个通过SSL域名去反向代理,在 /usr/local/nginx/conf/conf.d
目录下创建一个虚拟主机配置文件,其内容如下:
server {
listen 443 ssl http2;
server_name searx.jerion.cn;
ssl_certificate /etc/ssl/certs/searx.jerion.cn/searx.jerion.cn.pem;
ssl_certificate_key /etc/ssl/certs/searx.jerion.cn/searx.jerion.cn.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
location / {
proxy_pass http://10.22.51.65:7780;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
配置完成后,重载nginx服务即可:
nginx -t
nginx -s reload
2.配置nginx隐藏http头部中的nginx版本号
正常情况下,当访问nginx出现403情况时,下方的nginx会显示出版本号:

在 Nginx 配置中使用 server_tokens off;
语句可以隐藏 HTTP 头部中的 Nginx 版本号,这是一个提高安全性的措施,防止攻击者通过版本号识别潜在的漏洞。
下面是如何在 Nginx 配置中使用 server_tokens off;
的步骤:
-
打开 Nginx 配置文件:通常配置文件位于
/etc/nginx/nginx.conf
或/etc/nginx/conf.d/
目录下,但具体位置可能根据你的安装而有所不同。 -
编辑配置文件:找到
http
块,然后添加server_tokens off;
语句。例如:http { server_tokens off; # 其他配置项 }
-
保存并关闭文件。
-
重新加载 Nginx 配置:使配置更改生效,需要重新加载 Nginx,使用以下命令:
nginx -s reload
这样设置之后,Nginx 在 HTTP 头部中将不再显示版本号:

六、扩展知识
在实践案例中,我们了解了如何通过源码编译的方式在 CentOS 7 上安装和配置 Nginx。除了上述示例中的步骤,还有一些其他值得注意的知识点:
- Nginx 配置文件:Nginx 的主要配置文件位于
/usr/local/nginx/conf/nginx.conf
,你可以根据需要进行修改和定制。 - 虚拟主机配置:Nginx 支持虚拟主机,可以在配置文件中添加多个 server 块来配置不同的虚拟主机。
- HTTPS 配置:如果需要启用 HTTPS 支持,可以在 Nginx 配置文件中配置 SSL 证书和密钥,并将监听端口改为 443。
- 性能优化:Nginx 以其高性能而闻名,但在实际应用中,还可以进行一些性能优化的配置,例如启用缓存、调整工作进程数等。
总之,通过源码编译安装 Nginx 可以获得更高的灵活性和定制性。Nginx 是一个功能强大的 Web 服务器,适用于各种规模的网站和应用场景。
七、相关问题
**systemctl reload nginx
、systemctl restart nginx
、nginx -s reload
:**这三条命令都用于管理和控制 Nginx 服务,但它们有不同的作用和使用场景。以下是每条命令的详细解释及其显著区别:
1.详细解释
-
systemctl reload nginx
:-
作用:重新加载 Nginx 服务。
-
描述:该命令会通知 Nginx 重新加载其配置文件,而不停止服务。这意味着任何新的配置更改将被应用,但现有的连接不会被中断。
-
使用场景:当你对 Nginx 的配置文件做了更改,并希望应用这些更改而不中断当前连接时使用。
-
-
systemctl restart nginx
:-
作用:重启 Nginx 服务。
-
描述:该命令会停止 Nginx 服务并立即重新启动它。这会导致所有当前连接中断。
-
使用场景:当你需要完全重新启动 Nginx 服务,比如安装了新的模块或补丁,或需要解决一些服务异常问题时使用。
-
-
nginx -s reload
:-
作用:使用 Nginx 自带的控制信号重新加载配置。
-
描述:该命令发送
SIGHUP
信号给 Nginx 主进程,告诉它重新加载配置文件。这与systemctl reload nginx
的效果相同,即应用新的配置而不中断服务。 -
使用场景:与
systemctl reload nginx
相同,当你对 Nginx 配置文件进行了修改并希望应用这些更改而不中断当前连接时使用。
-
2.区别总结
systemctl reload nginx
和nginx -s reload
都用于重新加载 Nginx 配置文件,但systemctl reload nginx
是通过 systemd 来管理服务的,而nginx -s reload
是直接向 Nginx 进程发送信号。systemctl restart nginx
用于完全重启 Nginx 服务,会导致服务中断,适用于需要彻底重启服务的情况。nginx -s reload
和systemctl reload nginx
都不会中断当前连接,而systemctl restart nginx
会中断所有连接。
3.推荐使用场景
- 应用配置更改:
systemctl reload nginx
或nginx -s reload
- 完全重启服务:
systemctl restart nginx