Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现很好。
1. 安装nginx
nginx是最常用的反向代理代理服务器,现在就让nginx为我们做反向代理吧。我们可以通过centos的yum安装,也可以自己编译安装,或者也可以通过本地rpm安装。如果对版本没有什么要求,还是推荐yum安装,很简单无需过多的配置。
1.1 yum安装nginx
1 2 3 4 5 6 7 8 9
| #搜索nginx 两种方式都可行 yum search nginx --showduplicates yum list nginx --showduplicates
#安装指定版本,不指定版本直接yum install -y nginx即可 yum install -y nginx-all-modules-1.16.1-3.el7.noarch
#查看nginx是否安装完成 nginx -v
|
1.2 rpm包安装nginx
yum的nginx包一般跟随系统版本变化,有时候可能yum中没有我们想要的版本,我们可以使用rpm包进行安装。首先我们需要去网上下载一个rpm包(rpm包下载),找到我们想要的版本然后下载下来。例如下载 nginx-all-modules-1.16.1-3.el7 及相关安装依赖包。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| #以下是nginx全模块包及其依赖 #nginx-1.16.1-3.el7.x86_64.rpm #nginx-all-modules-1.16.1-3.el7.noarch.rpm #nginx-filesystem-1.16.1-3.el7.noarch.rpm #nginx-mod-http-image-filter-1.16.1-3.el7.x86_64.rpm #nginx-mod-http-perl-1.16.1-3.el7.x86_64.rpm #nginx-mod-http-xslt-filter-1.16.1-3.el7.x86_64.rpm #nginx-mod-mail-1.16.1-3.el7.x86_64.rpm #nginx-mod-stream-1.16.1-3.el7.x86_64.rpm #将上述安装包放入创建的nginx文件夹中 mkdir -p /opt/package/nginx
#进入nginx文件夹 cd /opt/package/nginx
#yum本地安装所有安装包 yum localinstall *
#查看nginx是否安装完成 nginx -v
|
1.3 手动编译安装nginx
首先我们先安装nginx的依赖。
1 2 3 4 5 6 7
| yum install -y gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
|
然后我们可以去nginx 官网下载安装包,将下载好的文件放到 /usr/local/nginx或者你想放置的目录
1.3.1 解压
1 2
| tar zxf nginx-1.16.1.tar.gz
|
1.3.2 编译
1 2 3 4 5 6
| #进入解压后的文件,编译安装 运行./configure ./configure #./configure --prefix=/usr/local/nginx
#编译并安装 make && make install #编译安装之后出现make[1]: Leaving directory '/usr/local/nginx/nginx-1.16.1' 表示编译成功
|
1.3.3 测试启动nginx
1 2 3 4 5 6 7 8 9 10 11 12
| #cd到刚才配置的安装目录/usr/loca/nginx/ 测试是否安装成功 ./sbin/nginx -t
#启动nginx cd /usr/local/nginx/sbin ./nginx
#查看nginx进程号 ps aux | grep nginx
#杀掉nginx kill -9 <进程号>
|
1.3.4 配置nginx环境变量
1 2
| #配置环境变量 vim /etc/profile
|
1 2 3
| #配置nginx的环境变量 PATH=$PATH:/usr/local/nginx/sbin export PATH
|
1.3.5 建立service启动文件
1 2
| #建立服务文件,并进入编辑 vim /lib/systemd/system/nginx.service
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| [Unit] Description=nginx - high performance web server After=network.target remote-fs.target nss-lookup.target
[Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop #PrivateTmp=True
[Install] WantedBy=multi-user.target
|
1 2
| #重载守护进程,使文件生效 systemctl daemon-reload
|
1.4 启动nginx
安装成功后,启动nginx,其实我们只需要执行最后一个命令即可完成对nginx的启动和设置自启。
1 2 3 4 5 6 7 8 9 10 11
| #启动nginx systemctl start nginx
#停止nginx systemctl stop nginx
#nginx开启自启 systemctl enable nginx
#启动nginx并开启自启 systemctl enable nginx --now
|
2. 配置nginx
nginx的配置文件放在/etc/nginx/目录下,我们进入该目录,发现目录有很多文件,我们只需要关注nginx.conf文件即可。

我们打开nginx.conf文件,将里面的server{ }块注释掉,因为我们将要配置我们自己的server 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # server { # listen 80; # listen [::]:80; # server_name _; # root /usr/share/nginx/html;
# # include /etc/nginx/default.d/*.conf; #
# location = /404.html { # } #
# location = /50x.html { # } # }
|
现在我们先到/etc/nginx/con.d/目录中,新建domain.conf(替换你自己的域名或者其他你想要的名称),这将是我们建立的第一个nginx配置文件。下面是配置文件,根据自己的需要进行配置即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #配置80端口 server { listen 80 default_server; #默认服务器,如果http匹配不上都会到这里来 listen [::]:80 default_server; server_name domain.com; #你的域名 root /usr/share/nginx/html; #nginx的静态文件目录
# Load configuration files for the default server block. include /etc/nginx/default.d/*.conf;
# certbot用来申请免费证书用 location ~ /.well-known { root /usr/share/nginx; allow all; }
#将http转到https rewrite ^(.*)$ https://$host$1 permanent;
}
#配置443端口 server { listen 443 ssl; listen [::]:443 ssl; server_name domain.com; #你的域名 root /usr/share/nginx/html; #nginx的静态文件目录
#这里是你的证书 ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #TLS版本,我们可以都开启,也可以按需配置 ssl_session_cache shared:MozSSL:10m; ssl_session_timeout 5m; #会话过期时间5分钟 ssl_session_tickets off; #会话票证,开启能节省TLS握手开销 ssl_ciphers HIGH:!aNULL:!MD5; #nginx初始加密 ssl_prefer_server_ciphers off; #如果开启,在TLS握手时启用服务器算法优先,由服务器选择适配算法而非客户端选择 #keepalive_timeout 60; #保持连接超时时间60分
# 包含其他的配置文件 include /etc/nginx/default.d/*.conf;
# 同样是certbot用来申请免费证书用 location ~ /.well-known { root /usr/share/nginx; allow all; }
#这里可以配置自己的服务,让nginx反向代理你的服务
# 404页面 error_page 404 /404.html; location = /40x.html { }
# 服务器错误的页面 error_page 500 502 503 504 /50x.html; location = /50x.html { } }
|
设置完domain.config后我们退出保存,现在就运行命令让nginx生效。
1 2 3 4 5
| #检查nginx配置文件语法是否正确 nginx -t
#重载nginx,让配置文件生效 nginx -s reload
|
现在我们访问domain.com,应该会出现Welcome to CentOS页面,因为我们设置了nginx静态文件的目录,它会访问nginx的index.html文件

3. 防火墙放行
虽然我们已经将nginx的配置完成了,但我们依然需要配置[[防火墙]]才可以外部访问,如果是阿里云vps或腾讯云可以配置安全组以放行nginx 代理的80端口和443端口。
1 2 3 4 5 6 7 8 9 10 11
| #开放80和443端口 #zone=public代表公开空间 外部可访问 # --permanent表示永久有效 firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --zone=public --add-port=443/tcp --permanent
#重载防火墙 firewall-cmd --reload
#查看开放的防火墙 firewall-cmd --zone=public --list-ports
|
4. 申请TLS证书
申请证书我们可以使用免费的certbot来进行申请,certbot使用的是Let's Encrypt。之前,我们已经给nginx配置了location ~ /.well-known的代理,certbot需要这个路径进行证书申请。
1 2 3 4 5 6 7 8 9 10 11
| #先安装cerbot yum install cerbot
#查看certbo的版本,也可以用来验证是否安装成功 certbot --version
#申请正式 #将xxx@email.com换成自己的邮箱 #将domain.com换成自己的域名 #-w /usr/share/nginx/指定的是nginx的文件目录,如果跟我一样自己装的nginx,无需更改 certbot certonly --webroot --agree-tos -v -t --email xxx@email.com -w /usr/share/nginx/ -d domain.com
|
如果出现Congratulations说明申请成功,同时会附上域名证书的路径,这个路径就是我们配置nginx证书位置填的路径。
1 2
| /etc/letsencrypt/live/domain.com/fullchain.pem /etc/letsencrypt/live/domain.com/privkey.pem
|
nginx的ssl_certificate配置fullchain.pem
nginx的ssl_certificate_key配置privkey.pem
5. 自动续签TLS证书
certbot申请的证书一般只有2-3个月的有效期,过了有效期就需要进行续签。那么怎么才能自动续签呢。我们可以使用cron定时任务来自动运行certbot进行续签。
1 2
| #配置cron定时任务,以下命令打开cron的配置文件 crontab -e
|
添加一个cron定时任务
1 2
| # 设置每天的0点钟进行续签, post-hook是续签完成之后操作的命令 0 0 * * * certbot renew --post-hook "/usr/sbin/nginx -s reload"
|
网上有些人说需要重启nginx,但我认为nginx -s reload重载命令就是为了重新生效配置文件,停止nginx意味着网站都不能打开了,一般在生产环境是不可能去停止nginx的。不过我还没有到续签的时候,所以也还没有成功过,如果有成功的经验,欢迎分享。 自动续签已经持续一年多,很稳定。