centos 7 源码方式安装nginx(1.18.0) + ssl + 阿里证书配置
直接使用yum方式安装的ngninx默认是不支持ssl的,所以需要从代码编译安装
一、查看要安装的版本
http://nginx.org/en/download.html
这里我们选择的稳定版1.18.0
二、先安装依赖
安装依赖之前最好先执行下update
yum update
安装相关依赖
yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel -y
三、下载源码
切换到/usr/local/src目录下,下载源代码解压
cd /usr/local/src
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz
四、编译源代码
切换目录
cd /usr/local/src/nginx-1.18.0
编译nginx,带:ssl/gzip/realip等功能
./configure --prefix=/usr/local/nginx \
--with-threads \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_ssl_module
以下是configure参数说明:
--with-threads
:启用thread pool支持。--with-http_realip_module
:允许从请求报文头中更改客户端的ip地址,默认为关。--with-http_stub_status_module
:启用ngx_http_stub_status_module 支持查看nginx的状态页。--with-http_ssl_module
:启用ngx_http_gzip_static_module支持,支持在线实时压缩输出数据流。--with-http_ssl_module
:启用https支持。
编译成功后的截图
编译报错的解决办法,没有报错直接跳过
-
报错:./configure: error: the HTTP rewrite module requires the PCRE library.
问题原因:编译安装nginx需要pcre包,未安装的话会报错
解决办法:
yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel -
报错:File "/usr/bin/yum", line 30 except KeyboardInterrupt, e:
问题原因:yum采用python作为命令解释器,原来系统自带的python解释器为python2.7,系统默认的解释器为python3.7
解决办法:
vim /usr/bin/yum
修改第一行为:#!/usr/bin/python2.7
vi /usr/libexec/urlgrabber-ext-down
修改第一行为:#!/usr/bin/python2.7 -
报错:File "/bin/yum-config-manager", line 135 except yum.Errors.RepoError, e:
问题原因:yum采用python作为命令解释器,原来系统自带的python解释器为python2.7,系统默认的解释器为python3.7
解决办法:
vim /bin/yum-config-manager
修改第一行为:#!/usr/bin/python2.7 -
报错:./configure: error: SSL modules require the OpenSSL library.
问题原因: 缺少SSL库
解决办法:yum -y install openssl openssl-devel
五、初次安装nginx
如果是第一次安装或已卸载后安装的话,用编译+安装指令:
make && make install
六、编译更新nginx版本 (初次安装跳过此步骤)
如果nginx已经安装过,执行编译指令:
make
make成功后查看下src下的版本信息,截图带--with-http_ssl_module说明就是带ssl参数编译的
/usr/local/src/nginx-1.18.0/objs/nginx -V
确认编译后的版本无问题后,把上一步make编译后的nginx文件,覆盖指定原版本,输入y
确认覆盖完就更新成功了!!
cp /usr/local/src/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/
七、查看nginx的版本信息
查看安装or更新后的nginx版本,也可以直接nginx -V
/usr/local/nginx/sbin/nginx -V
八、配置开机自启动
vim /lib/systemd/system/nginx.service
复制以下内容保存(按ESC后:wq保存退出)
[Unit]
Description=nginx service
After=network.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 quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
设置开机自启动
systemctl enable nginx
启动、查看状态、重启nginx,指令3件套
systemctl start nginx
systemctl status nginx
systemctl restart nginx
也可以reboot重启机器后再查看nginx状态(验证开机自启动)
九、配置nginx环境变量
一般修改配置后用 nginx -s reload 重启
nginx -s reload
出现以下提示是没有配置环境变量
打开/etc/profile
vim /etc/profile
在最后一行 追加下面2行配置(ESC :wq 保存退出)
# nginx path
PATH=$PATH:/usr/local/nginx/sbin
export PATH
使配置生效后,就可以用nginx -s reload
source /etc/profile
十、默认的nginx配置模板
在nginx默认配置上有一些小调整。
user nginx; # nginx启动用户,默认值:nobody
worker_processes auto; # nginx进程数,一般设为CPU的核心数,默认值:1
error_log logs/error.log; # 错误日志存放路径
#pid logs/nginx.pid;
events {
worker_connections 1024; # work进程打开的最大连接数
}
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; # 日志文件路径
charset utf-8;
sendfile on; # 开启高速传输模式,默认值:on
tcp_nopush on; # 减少网络报文段的数量
tcp_nodelay on; # 作用于socket参数,on=关闭nagle缓存算法,允许小包发送
keepalive_timeout 65; # 超时时间,单位秒
client_max_body_size 10m; # 文件大小限制,默认1m
# gzip相关
gzip on; # 是否开启gzip
gzip_buffers 32 4K; # 缓冲(压缩在内存中缓冲几块? 每块多大?)
gzip_comp_level 6; # 推荐6压缩级别(级别越高,压的越小,越浪费CPU计算资源)
gzip_min_length 1k; # 开始压缩的最小长度
gzip_types text/plain application/javascript text/css application/xml text/xml; # 对哪些类型的文件用压缩 如txt,xml,html ,css
gzip_disable "MSIE [1-6]\."; # 配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_http_version 1.0; # 开始压缩的http协议版本开始压缩的http协议版本
gzip_vary on; # 是否传输gzip压缩标志
#自定义变量
#set $serverip $server_addr; # 获取nginx内网ip
# Load modular configuration files
include conf/*.conf;
# 默认配置
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
# eror_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
# todo...
}
十一、阿里云SSL证书配置
把阿里云申请的证书放到目录 /data/cert 或者/usr/local/nginx/conf/cert (路径自己指定)
注意:服务器安全组要开启80/443端口
vi /usr/local/nginx/conf/nginx.conf
增加配置,把下面的www.yuming.com改成自己的域名
server {
listen 80;
server_name www.yuming.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl; # nginx1.15之后用这个语法,老的语法是ssl on;
server_name wwww.yuming.com;
ssl_certificate /data/cert/www.yuming.com.pem;
ssl_certificate_key /data/cert/www.yuming.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
location / {
client_max_body_size 12m; # 设置请求头大小
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://localhost:8001;
proxy_redirect off;
}
}
十二、腾讯云SSL证书配置
基本和阿里云差不多,在ssl_ciphers处有差异
注意:服务器安全组要开启80/443端口,申请证书的二级域名要和绑定的域名一致,如下例:service,否则会有不安全的警告
server {
listen 80;
server_name service.yuming.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl; # nginx1.15之后用这个语法,老的语法是ssl on;
server_name service.yuming.com;
ssl_certificate /data/cert/1_service.yuming.com_bundle.crt;
ssl_certificate_key /data/cert/2_service.yuming.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
client_max_body_size 12m; # 设置请求头大小
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://localhost:8081;
proxy_redirect off;
}
}
十三、Nginx其他配置
1、配置静态文件访问,autoindex on可以设置为开启索引,可自行设置
server {
listen 80;
server_name pic.yuming.com;
charset utf-8;
location / {
# 配置静态目录
root /data/upimgs;
autoindex off; # on显示资源目录,off不显示
autoindex_exact_size off; # on以bytes显示大小,off以KB、MB、GB显示文件大小
autoindex_format html; # 以html的方式进行格式化,可选参数有 html | json | xml
autoindex_localtime off; # 显示的⽂件时间为⽂件的服务器时间。默认为off,显示的⽂件时间为GMT时间
}
}
2、nginx限制ip访问 + 反向代理
server {
listen 80; #监听端口
server_name api.yuming.com; #域名
#自定义变量
set $serverip $server_addr; # 服务器地址放在变量里,避免重复取
#allow 61.18.22.155; # 限制固定ip访问
#allow 61.18.22.0/24; # 0/24意思是ip的前3段一致,值范围[8,16,24]
#deny all; # 拒绝所有的
location / {
root /data/website/goapp/dist; # 配置静态目录
index index.html; # 配置默认首页
try_files $uri $uri/ /index.html; # 解决刷新问题
}
location /api {
client_max_body_size 12m; #此处修改上传文件大小限制
proxy_pass http://127.0.0.1:8083; #反向代理地址+端口
proxy_set_header Host $http_host; #设置Host
proxy_set_header X-Real-Ip $remote_addr; #设置客户端远程地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Server-Ip $serverip; #设置服务器内网地址
proxy_set_header X-NginX-Proxy true;
# 下面暂时没啥用
set_real_ip_from 0.0.0.0/0; #从哪个信任前代理处获得真实用户ip
real_ip_header X-Forwarded-For; #接收到报文的哪个http首部去获取前代理传送的用户ip
real_ip_recursive on; #是否递归地排除直至得到用户ip(默认为off)
}
}
nginx加websocket配置
location /ws {
proxy_http_version 1.1;
proxy_pass http://localhost:8009;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}