Nginx编译安装
安装工具和库
yum -y install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
# PCRE是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式
# zlib库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip
cd /home
下载Nginx
wget http://nginx.org/download/nginx-1.25.0.tar.gz
解压
tar -zxvf nginx-1.25.0.tar.gz && cd nginx-1.25.0
安装模块(ssl、stream)
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_sub_module --with-http_gzip_static_module --with-pcre --with-stream
注:nginx第三方模块安装方法 ./configure --prefix=/你的安装目录 --with-模块名
#–prefix 指定安装路径
#–with-http_stub_status_module 允许查看nginx状态的模块
# --with-http_ssl_module 支持https的模块
编译并安装
make && make install
nginx配置文件目录
/usr/local/nginx/conf
配置
/usr/local/nginx/conf/nginx.conf
# 创建用户和用户组
#user nobody;
# 开启2个工作进程(2 核 CPU,至少应该为 CPU 的每一个核分配一个工作进程)
worker_processes 2;
# worker_processes auto;
# worker 进程会在一个适当的优先级启动。值的范围为 -20(优先级最高)~19(优先权最低),设置的值不应该低于-5,因为它是内核进程的默认优先级
worker_priority 0;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# 指定nginx进程运行文件存放地址
# pid /var/run/nginx.pid;
events {
# 设置网路连接序列化,防止惊群现象发生,默认为on
accept_mutex on;
# 设置一个进程是否同时接受多个网络连接,默认为off
multi_accept on;
# 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
#use epoll;
# 最大连接数,默认为512
worker_connections 1024;
}
# 为了让这个配置文件简单一些,将配置stream放入到include /usr/local/nginx/conf/conf.d/,并以.stream做后缀名。
# 需要为每个端口创建一个.stream做后缀名的配置文件
include /usr/local/nginx/conf/conf.d/*.stream;
http {
# 文件扩展名与文件类型映射表
include /usr/local/nginx/conf/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 /var/log/nginx/access.log main;
# 开启高效文件传输模式
# 允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile on;
# 每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
#sendfile_max_chunk 100k;
# 减少网络报文段数量
#tcp_nopush on;
# 提高I/O性能
tcp_nodelay on;
# 连接超时时间,默认为75s,可以在http,server,location块。
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# 负载均衡
#upstream mysvr {
# server 127.0.0.1:7878;
# server 192.168.10.121:3333 backup; #热备
#}
# 隐藏Nginx版本号
server_tokens off;
#该属性默认为off,表示如果header name中包含下划线,则忽略掉。
underscores_in_headers on;
# 设置请求体大小
client_max_body_size 100m;
include /usr/local/nginx/conf/conf.d/*.conf;
}
反向代理
普通端口
server {
# 监听端口(443端口开启ssl)
listen 18443;
# 监听地址(IP地址)
server_name 100.10.150.200;
# 监听地址(域名、需提前配置DNS解析)
# server_name www.melf.top;
# 反向代理
location / {
proxy_pass https://www.baidu.com/;
}
}
注:项目开发过程中,若第三方提供的接口有IP白名单,可以使用此方式进行中转(将服务器IP加入白名单、并在服务器进行转发配置)
开启ssl
server {
# 监听端口(443端口开启ssl)
# listen 443 ssl http2;
# listen [::]:443 ssl http2;
# 非443端口开启ssl
listen 442 ssl;
listen [::]:442 ssl;
# 监听地址
server_name www.melf.top;
# 开启HTTPS
#ssl on;
# ssl证书地址
# 配置nginx ssl证书的路径
ssl_certificate /usr/local/nginx/conf/cert/www.melf.top.pem;
ssl_certificate_key /usr/local/nginx/conf/cert/www.melf.top.key;
# 指定客户端建立连接时使用的ssl协议版本,如果不需要兼容TSLv1,直接去掉即可
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 指定客户端连接时所使用的加密算法,你可以再这里配置更高安全的算法
ssl_ciphers HIGH:!aNULL:!MD5;
# 激活会话重续提高https性能
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 5m;
ssl_session_tickets off;
# 激活服务器端保护免于BEAST攻击
ssl_prefer_server_ciphers on;
# 减少点击劫持
add_header X-Frame-Options DENY;
# 禁止服务器自动解析资源类型(失效某些浏览器的内容类型探嗅)
# 此配置开启会造成高德地图数据失效!!!
#add_header X-Content-Type-Options nosniff;
#防XSS攻击
add_header X-Xss-Protection 1;
# 路由跳转
location / {
rewrite ^/ https://guide.melf.space/MELF/;
}
access_log /var/log/nginx/www.melf.top.log;
error_log /var/log/nginx/www.melf.top.error.log;
}
实例
server {
# 监听端口
listen 443 ssl http2;
listen [::]:443 ssl http2;
# 监听地址
server_name 需要监听的域名;
# 开启HTTPS
#ssl on;
# ssl证书地址
# 配置nginx ssl证书的路径
ssl_certificate /etc/nginx/cert/需要监听的域名.pem;
ssl_certificate_key /etc/nginx/cert/需要监听的域名.key;
# 指定客户端建立连接时使用的ssl协议版本,如果不需要兼容TSLv1,直接去掉即可
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 指定客户端连接时所使用的加密算法,你可以再这里配置更高安全的算法
ssl_ciphers HIGH:!aNULL:!MD5;
# 激活会话重续提高https性能
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 5m;
ssl_session_tickets off;
# 激活服务器端保护免于BEAST攻击
ssl_prefer_server_ciphers on;
# 减少点击劫持
add_header X-Frame-Options DENY;
# 禁止服务器自动解析资源类型(失效某些浏览器的内容类型探嗅)
# 此配置开启会造成高德地图数据失效!!!
#add_header X-Content-Type-Options nosniff;
#防XSS攻击
add_header X-Xss-Protection 1;
# 配置404
error_page 404 /404;
# 前端
location / {
root /home/bus-pos/web/bus_pos_web/;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
# 前端
#location / {
# alias /home/bus-pos/web/bus_pos_web/;
#}
# 地图服务
location /_AMapService/maps {
set $args "$args&jscode=高德地图秘钥";
proxy_pass https://webapi.amap.com/maps;
}
# 自定义地图服务代理
location /_AMapService/v4/map/styles {
set $args "$args&jscode=高德地图秘钥";
proxy_pass https://webapi.amap.com/v4/map/styles;
}
# 海外地图服务代理
location /_AMapService/v3/vectormap {
set $args "$args&jscode=高德地图秘钥";
proxy_pass https://fmap01.amap.com/v3/vectormap;
}
# Web服务API 代理
location /_AMapService/ {
set $args "$args&jscode=高德地图秘钥";
proxy_pass https://restapi.amap.com/;
}
# 基础服务
location /sys_auth/{
proxy_pass http://127.0.0.1:1000/sys_auth/;
# 保留代理之前的host
# proxy_set_header Host $host;
proxy_set_header Host $host:$server_port;
# 保留代理之前的真实客户端ip
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 在多级代理的情况下,记录每次代理之前的客户端真实ip
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
# 指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值
proxy_redirect default;
}
# 业务
location /manage/{
proxy_pass http://127.0.0.1:1000/manage/;
# 保留代理之前的host
# proxy_set_header Host $host;
proxy_set_header Host $host:$server_port;
# 保留代理之前的真实客户端ip
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 在多级代理的情况下,记录每次代理之前的客户端真实ip
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
# 指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值
proxy_redirect default;
}
access_log /var/log/nginx/需要监听的域名.log;
error_log /var/log/nginx/需要监听的域名.error.log;
}
TCP/UDP转发
#stream模块和http模块是并列级别的,所以stream要写在http{}外边
stream {
# 负载均衡
upstream back{
server 10.112.9.15:8866;
}
server {
# 添加7000端口的stream代理配置
listen 8866;
proxy_connect_timeout 5s;
proxy_timeout 300s;
# 配置代理
proxy_pass back;
}
}
文件服务器
location /download/{
root /home/fs;
autoindex on; # 索引
autoindex_exact_size on; # 显示文件大小
autoindex_localtime on; # 显示文件时间
}
SSE(Server-Sent Events)
# SSE
location /jingxi_sse/{
proxy_pass http://127.0.0.1:9001/jingxi_sse/;
# 允许 所有头部 所有域 所有方法
# add_header 'Access-Control-Allow-Origin' '*';
# add_header 'Access-Control-Allow-Headers' '*';
# add_header 'Access-Control-Allow-Methods' '*';
# 设置http版本为1.1
proxy_http_version 1.1;
# 机制:转发请求头为空字符串,不会透传;由于HTTP/1.1不指定Connection,默认是keepalive长连接
# 设置Connection为长连接
proxy_set_header Connection "";
# 控制是否打开后端响应内容的缓冲区,如果这个设置为off,那么proxy_buffers和proxy_busy_buffers_size这两个指令将会失效。
proxy_buffering off;
# off参数可以屏蔽从上层配置继承的缓存功能
proxy_cache off;
chunked_transfer_encoding off;
proxy_redirect off;
# proxy_buffer_size 1024k;
# proxy_buffers 16 1024k;
# proxy_busy_buffers_size 2048k;
# proxy_temp_file_write_size 2048k;
}
Websocket
location /jingxi_ws/ {
proxy_pass http://127.0.0.1:1000/ws/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
负载均衡
轮询
# 代理服务器
# 设置服务器组
upstream fuzai {
server 10.226.115.178:9002;
server 10.226.115.179:9002;
server 10.226.115.180:9002;
server 10.226.115.181:9002;
}
加权轮询
# 代理服务器
# 设置服务器组
upstream fuzai {
server 10.226.115.178:9002 weight=4;
server 10.226.115.179:9002 weight=2;
server 10.226.115.180:9002 weight=2;
server 10.226.115.181:9002 weight=2;
}
ip_hash
# 代理服务器
# 设置服务器组
upstream fuzai {
ip_hash;
server 10.226.115.178:9002;
server 10.226.115.179:9002;
server 10.226.115.180:9002;
server 10.226.115.181:9002;
}
least_conn(最少连接)
# 代理服务器
# 设置服务器组
upstream fuzai {
least_conn;
server 10.226.115.178:9002;
server 10.226.115.179:9002;
server 10.226.115.180:9002;
server 10.226.115.181:9002;
}
url_hash
# 代理服务器
# 设置服务器组
upstream fuzai {
hash $request_uri;
server 10.226.115.178:9002;
server 10.226.115.179:9002;
server 10.226.115.180:9002;
server 10.226.115.181:9002;
}
其他配置
server {
# 监听端口
listen 443 ssl http2;
listen [::]:443 ssl http2;
# 监听地址
server_name 需要监听的域名;
# 开启HTTPS
#ssl on;
# ssl证书地址
# 配置nginx ssl证书的路径
ssl_certificate /etc/nginx/cert/需要监听的域名.pem;
ssl_certificate_key /etc/nginx/cert/需要监听的域名.key;
# 指定客户端建立连接时使用的ssl协议版本,如果不需要兼容TSLv1,直接去掉即可
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 指定客户端连接时所使用的加密算法,你可以再这里配置更高安全的算法
ssl_ciphers HIGH:!aNULL:!MD5;
# 激活会话重续提高https性能
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 5m;
ssl_session_tickets off;
# 激活服务器端保护免于BEAST攻击
ssl_prefer_server_ciphers on;
# 减少点击劫持
add_header X-Frame-Options DENY;
# 禁止服务器自动解析资源类型(失效某些浏览器的内容类型探嗅)
# 此配置开启会造成高德地图数据失效!!!
#add_header X-Content-Type-Options nosniff;
#防XSS攻击
add_header X-Xss-Protection 1;
# 配置404
error_page 404 /404;
# 基础服务
location /{
proxy_pass http://fuzai/;
# 保留代理之前的host
# proxy_set_header Host $host;
proxy_set_header Host $host:$server_port;
# 保留代理之前的真实客户端ip
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 在多级代理的情况下,记录每次代理之前的客户端真实ip
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
# 指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值
proxy_redirect default;
}
access_log /var/log/nginx/需要监听的域名.log access;
error_log /var/log/nginx/需要监听的域名.error.log;
}
Log格式
log_format access escape=json '{ "@timestamp": "$time_iso8601″, '
'"remote_addr": "$remote_addr",'
'"costime": "$request_time",'
'"realtime": "$upstream_response_time",'
'"status": $status,'
'"x_forwarded": "$http_x_forwarded_for",'
'"referer": "$http_referer",'
'"request": "$request",'
'"upstr_addr": "$upstream_addr",'
'"bytes":$body_bytes_sent,'
'"dm":$request_body,'
'"agent": "$http_user_agent" }';
server {
# 监听端口
listen 443 ssl http2;
listen [::]:443 ssl http2;
# 监听地址
server_name 需要监听的域名;
# 开启HTTPS
#ssl on;
# ssl证书地址
# 配置nginx ssl证书的路径
ssl_certificate /etc/nginx/cert/需要监听的域名.pem;
ssl_certificate_key /etc/nginx/cert/需要监听的域名.key;
# 指定客户端建立连接时使用的ssl协议版本,如果不需要兼容TSLv1,直接去掉即可
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 指定客户端连接时所使用的加密算法,你可以再这里配置更高安全的算法
ssl_ciphers HIGH:!aNULL:!MD5;
# 激活会话重续提高https性能
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 5m;
ssl_session_tickets off;
# 激活服务器端保护免于BEAST攻击
ssl_prefer_server_ciphers on;
# 减少点击劫持
add_header X-Frame-Options DENY;
# 禁止服务器自动解析资源类型(失效某些浏览器的内容类型探嗅)
# 此配置开启会造成高德地图数据失效!!!
#add_header X-Content-Type-Options nosniff;
#防XSS攻击
add_header X-Xss-Protection 1;
# 配置404
error_page 404 /404;
# 基础服务
location /{
proxy_pass http://127.0.0.1:1000/;
# 保留代理之前的host
# proxy_set_header Host $host;
proxy_set_header Host $host:$server_port;
# 保留代理之前的真实客户端ip
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 在多级代理的情况下,记录每次代理之前的客户端真实ip
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr;
# 指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值
proxy_redirect default;
}
access_log /var/log/nginx/需要监听的域名.log access;
error_log /var/log/nginx/需要监听的域名.error.log;
}
开机自启
/etc/systemd/system/
文件夹下创建一个启动脚本nginx.service
touch nginx.service chmod 755 nginx.service
设置内容
[Unit] Description=nginx service After=network.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx -g "daemon on; master_process on;" ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target
然后执行
systemctl daemon-reload systemctl enable nginx
Failed to execute operation: File exists
find / -name nginx.service
需要把多余的文件删除就可以了:
rm -rf 多余的文件或符号链接
systemctl enable nginx
nginx
启动systemctl start nginx
nginx
停止systemctl stop nginx
验证是否开机自启
reboot
随后开始设置开机自启,编辑etc文件
/etc/rc.d/rc.local
在最后一行加入nginx对应的路径,保存退出
/usr/local/nginx/sbin/nginx
设置完毕后需要给文件添加可执行权限,添加后可看到字体变绿
chmod +x /etc/rc.d/rc.local
使用reboot重启
reboot
使用 ps -ef 检查是否成功开机自启。如图显示自启成功
ps -ef | grep nginx
常用命令
启动 Nginx
/usr/local/nginx/sbin/nginx
检测 Nginx
配置是否正确
/usr/local/nginx/sbin/nginx -t
重新载入 Nginx
配置
/usr/local/nginx/sbin/nginx -s reload
查看 Nginx
进程
ps aux | grep nginx
查看端口占用
netstat -ntlp
参考文档
https://www.weixueyuan.net/a/751.html
https://www.cnblogs.com/carrothhh/p/13377135.html
https://blog.csdn.net/Y_Yoooo/article/details/124753388
https://blog.csdn.net/weixin_30795127/article/details/97385091#proxy_cache
https://blog.csdn.net/weixin_44623055/article/details/124715177