Nginx 安装与配置
Nginx简介
Nginx 是一个高性能的Web服务器和反向代理服务器,也可以作为邮件代理服务器。
项目中主要使用的是Web服务器和反向代理功能。
Nginx特点:
占有内存少,并发能力强,以高性能,低系统资源消耗。
官方测试为5W并发请求,实际情况看服务器性能。
反向代理与正向代理
反向代理
代理服务器(Nginx)接收外部请求,不处理请求,直接将其转发给内部服务器,并将内部服务器的结果返回给请求的客户端,这就是反向代理,Nginx也是通过反向代理来实现负载均衡的。
正向代理
以访问网站为例,当本机无法访问时,找到一台可以访问的服务器作为本机的代理服务器,告诉代理服务器需要访问的网站,然后代理服务器接收到我的请求,并将网站的返回结果给我。
简单来说就是VPN。
Nginx下载和安装
官方网站:http://nginx.org
# 添加 EPEL 软件仓库
yum install epel-release -y
# 安装nginx
yum install nginx -y
# 启动nginx,并设置未开机启动
systemctl start nginx
systemctl enable nginx
# 安装完成后,如果localhost:80访问不了可能是以下问题
# 1.防火墙80端口未开放
# 查看80端口是否开放
firewall-cmd --query-port=80/tcp
# 解决方式1:关闭防火墙
systemctl stop firewalld
# 解决方法2:开放80端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload
# 2.SELinux策略导致访问失败
# 临时关闭SELinux
setenforce 0
# 如果临时关闭后可以访问,说明确实是SELinux引起的问题
# 解决方法1:永久设置SELinux为宽容模式,需要重启生效
# 宽容模式不会强制拦截,会记录日志
sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
reboot
# 解决方法2:永久关闭SELinux,需要重启生效
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
reboot
# 解决方法3:添加nginx到selinux的允许列表
yum install policycoreutils-python
cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx
semodule -i mynginx.pp
Nginx默认文件目录
yum方式安装的默认文件路径
默认配置文件的路径:/etc/nginx/nginx.conf
Nginx网站默认存放目录:/usr/share/nginx/html
网站默认主页路径:/usr/share/nginx/html/index.html
Nginx配置文件详解
默认配置文件
# 配hiworker进行的运行用户
user nginx;
# 配置工作进行的数量,根据硬件调整,通常为CPU数量的 0.8-2倍,自动模式待了解
worker_processes auto;
#配置全局错误日志及类型,[debug | info | notice | warn | error | crit],默认是error
error_log /var/log/nginx/error.log;
#配置进程pid文件
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
#配置工作模式和连接数
events {
# 一个worker进程的连接上限,最大值是65536
# nginx 总连接数(并发数) =
# worker进程数量(worker_processes)* 一个worker的连接上限(worker_connections)
worker_connections 1024;
}
http {
#配置日志格式
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日志及存放路径,并使用上面定义的main日志格式(访问记录)
access_log /var/log/nginx/access.log main;
#开启高效文件传输模式(默认打开即可)
sendfile on;
#防止网络阻塞(上线通常要打开)
tcp_nopush on;
# 禁用Nagle算法,可以减少延迟,nagle算法是为了减少网络中小包数量的tcp优化机制,他会获 取到小包后等待其他小包后合并再发送,而web服务往往需要数据包很小也要立刻发送
tcp_nodelay on;
#长连接超时时间,单位是秒
keepalive_timeout 65;
types_hash_max_size 4096;
#配置nginx支持哪些多媒体类型,可以在conf/mime.types查看支持哪些多媒体类型
#如果文件在支持的类型中就会返回文件,如果不在就会以下面默认文件类型返回也就是文件流的方式返回
include /etc/nginx/mime.types;
#默认文件类型 流类型,可以理解为支持任意类型
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
#配置虚拟主机,可以有多个server,但是两个server的端口和服务名不能完全一致
# 可以同端口不同服务名或同服务名不同端口
server {
#配置监听端口 IPv4
listen 80;
#配置监听端口 IPv6
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 {
}
}
# Settings for a TLS enabled server.
#
# server {
# listen 443 ssl http2;
# listen [::]:443 ssl http2;
# server_name _;
# root /usr/share/nginx/html;
#
# ssl_certificate "/etc/pki/nginx/server.crt";
# ssl_certificate_key "/etc/pki/nginx/private/server.key";
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 10m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# error_page 404 /404.html;
# location = /40x.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
# }
}
基本配置文件示例
在默认配置文件中通过 include /etc/nginx/conf.d/*.conf; 将/etc/nginx/conf.d 目录下的 .conf 文件追加进入了Nginx配置文件的http { }中,所以在/etc/nginx/conf.d目录下创建的 .conf文件只需要配置server即可。
下面是一些示例:
server {
# 监听端口 IPv4
listen 80;
# 服务名(域名)
server_name example.com;
# 静态资源路由配置
location / {
# 静态资源目录,这里会访问目录下的 index.html
root /home/projects/web-ui;
# 当访问的URI无法直接映射到文件时,尝试按顺序匹配 URI 及其尾部添加'/'后的URI,最后指向 '/index.html'
try_files $uri $uri/ /index.html;
# 设定索引文件,当请求的是目录时,优先查找这些文件作为默认页面
index index.html index.htm;
}
# 代理转发至后端服务配置
location /api/{
# 将匹配到/api/的所有请求转发到本地8080端口的服务
proxy_pass http://localhost:8080/;
# 将请求Host头原封不动传递给后端
proxy_set_header Host $http_host;
# 设置真实的客户端IP地址
proxy_set_header X-Real-IP $remote_addr;
# 设置远程主机IP地址(这里与X-Real-IP相同)
proxy_set_header REMOTE-HOST $remote_addr;
# 添加经过代理的IP列表,包含客户端IP和其他中间代理IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 阻止对 '/actuator' 目录的访问
if ($request_uri ~ "/actuator") {
# 返回403 Forbidden错误码,禁止访问
return 403;
}
# 错误页面配置,当出现500、502、503、504错误时,显示自定义错误页面
error_page 500 502 503 504 /50x.html;
# 定义50x错误页面的具体位置
location = /50x.html {
# 在html目录下寻找名为50x.html的文件作为错误页面
root html;
}
}
HTTPS基本配置文件示例
upstream servers {
server 127.0.0.1:8080;
}
server {
listen 80;
listen [::]:80;
# 配置www.example.cn与example.cn 是因为用户如果通过example.cn访问,则映射不到此处
server_name www.example.cn example.cn;
# 将请求转成https
if ($host = 'example.cn' ){
rewrite ^/(.*)$ https://www.example.cn/$1 permanent;
}
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.example.cn example.cn;
# ssl证书的pem文件路径
ssl_certificate /etc/nginx/ssl/server.crt;
# ssl证书的key文件路径
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 此项目不是前后端分离项目,所以地址为后端服务器
location / {
proxy_pass http://servers;
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
上游服务器池(upsteam)
有多台后端服务器时,可以通过上游服务器池(upstream)实现负载均衡策略访问。
upstream与轮询策略
#配置上游服务器
#格式为:upstream 自定义服务器组名称{服务器地址1,服务器地址2...}
# 默认为轮询策略
upstream servers {
server 192.168.1.99:8080;
server 192.168.1.98:8080;
...
}
# 使用方式,将proxy_pass中的地址修改为服务器组名称即可
server {
...
location /api/{
# proxy_pass http://localhost:8080/;
proxy_pass http://servers;
}
...
}
# 其他策略
# 加权轮询
# 1/1+2 的请求发给99服务器
# 2/1+2 的请求发给98服务器
upstream servers {
server 192.168.1.99:8080 weight=1;
server 192.168.1.98:8080 weight=2;
...
}
# iphash策略
# 用户在一定时间内IP地址时固定的,所以通过IP的hash函数计算得到的值也是固定的
# 那么该用户的请求会被转发到同一台服务器
upstream servers {
# 这里是iphash策略
ip_hash;
server 192.168.1.99:8080;
server 192.168.1.98:8080;
...
}
# url_hash策略
# 与iphash策略相似,是通过url进行hash函数计算
upstream servers {
hash $request_uri;
server 192.168.1.99:8080 weight=1;
server 192.168.1.98:8080 weight=2;
...
}
# least_conn策略(最少连接策略)
# least_conn策略会追踪所有后端服务器当前的活动连接数,将新的请求分配给活跃连接数最少的服务器,同时可以配合加权使用(weight=2)
upstream servers {
least_conn;
server 192.168.1.99:8080;
server 192.168.1.98:8080;
...
}
upstream与服务标识(down与backup)
down:表示服务器宕机,Nginx不会将请求转发给它。
backup:表示这个服务是备份服务器,当其他服务器都无法访问时,Nginx才会将请求转发给备份服务器使用。
upstream servers {
server 192.168.1.99:8080 down;
server 192.168.1.98:8080 backup;
server 192.168.1.97:8080;
...
}
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 七十七
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果