部署nginx及申请TLS证书
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现很好。
1. 安装nginx
nginx
是最常用的反向代理代理服务器,现在就让nginx
为我们做反向代理吧。我们可以通过centos
的yum
安装,也可以自己编译安装,或者也可以通过本地rpm
安装。如果对版本没有什么要求,还是推荐yum
安装,很简单无需过多的配置。
1.1 yum安装nginx
#搜索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
及相关安装依赖包。
#以下是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
的依赖。
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 解压
#解压
tar zxf nginx-1.16.1.tar.gz
1.3.2 编译
#进入解压后的文件,编译安装 运行./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
#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环境变量
#配置环境变量
vim /etc/profile
#配置nginx的环境变量
PATH=$PATH:/usr/local/nginx/sbin
export PATH
#生效
source /etc/profile
1.3.5 建立service启动文件
#建立服务文件,并进入编辑
vim /lib/systemd/system/nginx.service
[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
#重载守护进程,使文件生效
systemctl daemon-reload
1.4 启动nginx
安装成功后,启动nginx,其实我们只需要执行最后一个命令即可完成对nginx
的启动和设置自启。
#启动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
。
# server {
# listen 80;
# listen [::]:80;
# server_name _;
# root /usr/share/nginx/html;
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# error_page 404 /404.html;
# location = /404.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
现在我们先到/etc/nginx/con.d/
目录中,新建domain.conf
(替换你自己的域名或者其他你想要的名称),这将是我们建立的第一个nginx配置文件
。下面是配置文件,根据自己的需要进行配置即可。
#配置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
生效。
#检查nginx配置文件语法是否正确
nginx -t
#重载nginx,让配置文件生效
nginx -s reload
现在我们访问domain.com
,应该会出现Welcome to CentOS
页面,因为我们设置了nginx
静态文件的目录,它会访问nginx
的index.html
文件
3. 防火墙放行
虽然我们已经将nginx
的配置完成了,但我们依然需要配置[[防火墙]]才可以外部访问,如果是阿里云vps或腾讯云可以配置安全组以放行nginx
代理的80端口
和443端口
。
#开放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
需要这个路径进行证书申请。
#先安装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证书位置填的路径。
/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
进行续签。
#配置cron定时任务,以下命令打开cron的配置文件
crontab -e
添加一个cron
定时任务
# 设置每天的0点钟进行续签, post-hook是续签完成之后操作的命令
0 0 * * * certbot renew --post-hook "/usr/sbin/nginx -s reload"
网上有些人说需要重启nginx
,但我认为nginx -s reload
重载命令就是为了重新生效配置文件,停止nginx
意味着网站都不能打开了,一般在生产环境是不可能去停止nginx
的。不过我还没有到续签的时候,所以也还没有成功过,如果有成功的经验,欢迎分享。 自动续签已经持续一年多,很稳定。