# Linux2
服务器配置
# Nginx
Nginx是常用的网络服务器,ubuntu和debian类似,这里以centos7为例
yum install nginx
nginx的默认安装目录为/usr/local/nginx
,配置文件的目录为/usr/local/nginx/conf/nginx.conf
启动nginx服务
systemctl enable nginx.service
systemctl start nginx.service
systemctl stop nginx.service
systemctl restart nginx.service
2
3
4
nginx命令
nginx -s reload # 热重启
nginx -s reopen # 重启Nginx
nginx -s stop # 快速关闭
nginx -s quit # 等待工作进程处理完成后关闭
nginx -T # 查看配置文件的实际内容
2
3
4
5
# 默认主页、目录访问
server {
root /网站根目录;
# 优先使用默认主页
index index.html index.htm index.php;
# 当默认主页不存在时直接列出目录内文件树
autoindex on;
}
2
3
4
5
6
7
# 反向代理
先了解正向代理
正向代理:局域网中的电脑用户想要直接访问网络是不可行的,只能通过代理服务器来访问,这种代理服务就被称为正向代理。
反向代理是一个Web
服务器,它接受客户端的连接请求,然后将请求转发给上游服务器,并将从服务器得到的结果返回给连接的客户端。
客户端访问网络不需要配置,只要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,然后再返回到客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址
location匹配规则:
~:正则匹配,区分大小写
~*:正则匹配,不区分大小写
@:定义一个命名的location,用于内部定向,例如error_page、try_files
=:普通字符匹配,精确匹配
^~:普通字符匹配,如果该选项匹配,则只匹配该选项,不再向下匹配其他选项
匹配优先级(与location书写的先后顺序关系不大):
1.精确匹配:=符号严格匹配这个查询,如果找到,停止搜索,
2.普通字符匹配:所有剩下的常规字符串,最长的匹配;如果找到^~这个符号停止搜索;
3.正则匹配;
4.默认匹配:如果第三条条件生效使用第三条,否则使用第二条
nginx做http反向代理
location ^~ /api {
proxy_pass http://192.168.40.174:32020;
}
server{
listen:90;
server_name:192.168.0.1
location /edu/{
root html;
proxy_pass http://192.168.40.174:32020;
}
location /ovd/{
root html;
proxy_pass http://192.168.40.174:32020;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
更多指令说明
指令 | 说明 |
---|---|
proxy_connect_timeout | Nginx 从接受请求至连接到上游服务器的最长等待时间 |
proxy_send_timeout | 后端服务器数据回传时间(代理发送超时) |
proxy_read_timeout | 连接成功后,后端服务器响应时间(代理接收超时) |
proxy_cookie_domain | 替代从上游服务器来的Set-Cookie 头的domain 属性 |
proxy_cookie_path | 替代从上游服务器来的Set-Cookie 头的path 属性 |
proxy_buffer_size | 设置代理服务器(nginx )保存用户头信息的缓冲区大小 |
proxy_buffers | proxy_buffers 缓冲区,网页平均在多少k 以下 |
proxy_set_header | 重写发送到上游服务器头的内容,也可以通过将某个头部的值设置为空字符串,而不发送某个头部的方法实现 |
proxy_ignore_headers | 这个指令禁止处理来自代理服务器的应答。 |
proxy_intercept_errors | 使nginx 阻止HTTP 应答代码为400或者更高的应答。 |
# 泛域名转发
server {
listen 80;
server_name ~^([\w-]+)\.user\.demo\.com$;
#配合上面语句可以把不同的域名转发到不同目录,如xuexb.user.demo.com-> /home/user/wwwroot/user/xuexb a01.user.demo.com-> /home/user/wwwroot/user/a01
root /home/user/wwwroot/user/$1;
## xuexb.user.demo.com/path -> 127.0.0.1:8080/xuexb/path a01.user.demo.com/path -> 127.0.0.1:8080/a01/path
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:8080/$1$request_uri;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Nodejs
server {
server_name www.xxoo.com;
listen 80;
root /wwwroot/www.xxoo.com/;
if (-f $request_filename/index.html) {
rewrite (.*) $1/index.html break;
}
if (!-f $request_filename) {
rewrite (.*) /index.js;
}
location = /index.js {
proxy_set_header Connection "";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:8001$request_uri;
proxy_redirect off;
}
}
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
# 配置浏览器缓存
不缓存
server {
expires -1;
if_modified_since off;##
}
## Cache-Control: no-cache;
2
3
4
5
设置缓存
server {
expires 1d;
## expires max;
}
## Cache-Control: max-age=315360000
2
3
4
5
根据路径设置不同的缓存策略
server {
set $expires_time 1M;
if($request_uri ~* ^/admin(\/.*)?$) {
set $expires_time -1;
}
if($request_uri ~* ^/admin(\/.*)?$) {
set $expires_time max;
}
expires $expires_time;
}
2
3
4
5
6
7
8
9
10
11
12
13
# 负载均衡
upstream
模块能够使用3种负载均衡算法:轮询、IP
哈希、最少连接数。
轮询: 默认情况下使用轮询算法,不需要配置指令来激活它,它是基于在队列中谁是下一个的原理确保访问均匀地分布到每个上游服务器;
轮询时考研指定轮询几率,weight
和访问比率成正比,用于后端服务器性能不均的情况。
#10次一般只会有1次会访问到8081,而有9次会访问到8080
upstream test {
server localhost:8080 weight=9;
server localhost:8081 weight=1;
}
2
3
4
5
IP哈希: 通过ip_hash
指令来激活,Nginx
通过IPv4
地址的前3
个字节或者整个IPv6
地址作为哈希键来实现,同一个IP地址总是能被映射到同一个上游服务器;
upstream test {
ip_hash;
server localhost:8080;
server localhost:8081;
}
2
3
4
5
最少连接数: 通过least_conn
指令来激活,该算法通过选择一个活跃数最少的上游服务器进行连接。如果上游服务器处理能力不同,可以通过给server
配置weight
权重来说明,该算法将考虑到不同服务器的加权最少连接数。
upstream使用第三方模块
Fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
fair;
server localhost:8080;
server localhost:8081;
}
2
3
4
5
url_hash:这是个第三方模块,按访问url
的hash
结果来分配请求,使每个url
定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream
中加入hash
语句,server
语句中不能写入weight
等其他的参数,hash_method
是使用的hash
算法
upstream backend {
hash $request_uri;
hash_method crc32;
server localhost:8080;
server localhost:8081;
}
2
3
4
5
6
# 支持CORS跨域
nginx配置做跨域处理--添加请求头
location ^~ /p/asm {
proxy_pass http://192.168.40.174:32020;
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Methods' 'GET,POST,PUT,DELETE,PATCH,OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Content-Type,ssid';
if ($request_method = 'OPTIONS') {return 204;}
proxy_redirect off;
proxy_set_header Host $host;
}
2
3
4
5
6
7
8
9
10
# 高可用keep-alived
正常情况下nginx是可以访问的,但是如果nginx出现宕机或者内存不够等程序错误,就会堵塞请求。为了防止这种情况的发生,配置高可用keep-alived进行预防
安装keep-alived
yum install keepalived -y
rpm -q -a keepalived
//keepalived-1.3.5-16.el7.x86_64
2
3
修改配置文件
systemctl start keepalived.service
vi keepalived.conf
2
把原主机ip地址换为虚拟ip
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.25.147
smtp_connect_timeout 30
router_id LVS_DEVEL # 访问的主机地址
}
vrrp_script chk_nginx {
script "/usr/local/src/nginx_check.sh" # 检测文件的地址
interval 2 # 检测脚本执行的间隔
weight 2 # 权重
}
vrrp_instance VI_1 {
state BACKUP # 主机MASTER、备机BACKUP
interface ens33 # 网卡
virtual_router_id 51 # 同一组需一致
priority 90 # 访问优先级,主机值较大,备机较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.25.50 # 虚拟ip
}
}
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
启动keep-alived
systemctl start keepalived.service
# 屏蔽ip/国外ip
在nginx
的配置文件nginx.conf
中加入如下配置,可以放到http
, server
, location
, limit_except
语句块,需要注意相对路径,本例当中nginx.conf
,blocksip.conf
在同一个目录中
include blockip.conf;
blockip.conf
deny IP; # 屏蔽单个ip访问
allow IP; # 允许单个ip访问
deny all; # 屏蔽所有ip访问
allow all; # 允许所有ip访问
deny 123.0.0.0/8 # 屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令
deny 124.45.0.0/16 # 屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令
deny 123.45.6.0/24 # 屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令
2
3
4
5
6
7
国外ip
基于 Nginx 的 ngx_http_geoip2 模块来禁止国外 IP 访问网站。
安装模块依赖
yum install libmaxminddb-devel -y
下载模块
git clone https://github.com/leev/ngx_http_geoip2_module.git
解压到/usr/local目录
mv ngx_http_geoip2_module/ /usr/local/
模块安装成功后,还要在 Nginx 里指定数据库,在安装运行库时默认安装了两个,位于 /usr/share/GeoIP/ 目录下,一个只有 IPv4,一个包含 IPv4 和 IPv6。
登录 www.maxmind.com 网址,创建账户,下载最新的库文件。(账户创建就不演示了)点击左侧,Download Files:
选择 GeoLite2 Country,点击 Download GZIP 下载即可:
上传到 /usr/share/GeoIP/ 下并解压:
cd /usr/share/GeoIP/
在nginx.conf中的http中引入数据库文件
geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
auto_reload 5m;
$geoip2_data_country_code country iso_code;
}
map $geoip2_data_country_code $allowed_country {
default yes;
CN no;
}
2
3
4
5
6
7
8
在 server 中的 location 下添加条件,如果满足 IP 是国外 IP,就执行下面的 return 动作,
可以直接返回 404或者别的页面:
if ($allowed_country = yes) {
# return https://www.baidu.com;
# return /home/japan;
return 404;
}
2
3
4
5
# 重定向
//重定向网站
server {
server_name old-site.com
return 301 $scheme://new-site.com$request_uri;
}
//重定向单页面
server {
location = /oldpage.html {
return 301 http://example.org/newpage.html;
}
}
//重定向子路径
location /old-site {
rewrite ^/old-site/(.*) http://example.org/new-site/$1 permanent;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 配置图片防盗链
防盗链是指当图片不是自己网站打开时返回403或者指定图片,通过判断请求的来路判断是否是自己的站点来设置
server {
location ~* \.(gif|jpg|png|bmp)$ {
valid_referers none blocked *.xuexb.com server_names
if ($invalid_referer) {
return 403;
}
}
}
2
3
4
5
6
7
8
9
# Https配置
# let's Encrypt
let's Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,由Mozilla、Cisco、Akamai、IdenTrust等组织发起,主要的目的也是为了推进网站由http向https过度。
let's Encrypt免费SSL证书的出现,也会对传统提供付费SSL证书服务的商家有不少的打击。目前Let‘s Encrypt获得IndenTrust交叉签名,也就是可以应用且支持包括Firefox、Chrome在内的主流浏览器的兼容和支持。
使用git安装
git clone https://github.com/letsencrypt/letsencrypt
生成证书
cd letsencrypt
./lensencrypt-auto certonly --standalone --email quiniton@163.com -d www.zhaoheqiang.me -d zhaoheqiang.me
2
执行命令之后,会在/etc/letsencrypt/live/下找到各个域名的文件夹,每个文件夹里面会有四个密钥证书文件:
cert.pem:Apache服务器端证书
chain.pem:Apache根证书和中继证书
fullchain.pem:Nginx所需要的ssl_certificate文件
privkey.pem:安全证书KEY文件
如果是Nginx,使用fullchain.pem和privacy.pem文件,在配置文件中加入语句
server {
listen 443 https;
ssl_certificate /etc/letsencrypt/live/www.zhaoheqiang.me/fullchain.pem
ssl_certificate_key /etc/letsencrypt/live/www.zhaoheqiang.me/privkey.pem
}
2
3
4
5
延长有效期
let's Encrypt的证书一般有有效期,需要手动更新续期
./lensencrypt-auto certonly --renew-by-default --email quiniton@163.com -d www.zhaoheqiang.me -d zhaoheqiang.me
# certbot
certbot是let's Encrypt官方推荐的获取证书的客户端。可以帮我们获取免费的let's Encrypt证书。certbot支持所有unix内核的操作系统。
安装certbot
yum install certbot
获取证书
certbot certonly --standalone -d example.com -d www.example.com
也可以用指定根目录的方式生成证书
certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com
证书生成后就可以在/etc/letsencrypt/live目录下看到对应域名的证书
let's Encrypt提供的证书一般都有90天有效期,在证书到期之前需要更新证书,certbot提供自动更新
certbot renew --dry-run
安装时如果报错
Problem binding to port 80:Could not bind to IPv4 or IPv6
因为nginx占用80端口,需要先停掉nginx进行操作,执行自动更新时也需要停掉nginx
# openssl
先生成一个key
openssl genrsa -des3 -out ssl.key 1024
根据key生成证书请求文件
openssl req -new -key ssl.key -out ssl.csr
最后根据这两个文件生成crt证书文件,如果需要pfx可以用第二个命令生成
openssl x509 -req -days 3650 -in ssl.csr -signkey ssl.key -out ssl.cer
openssl pkcs12 -export -inkey ssl.key -in ssl.crt -out ssl.pfx
2
在需要使用证书的server中配置
server {
ssl on;
ssl_certificate /home/ssl.crt;
ssl_certificate_key /home/ssl.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!EXPORT56:RC4+RSA+HIGH:+MEDIUM+LOW:+SSLv2:+EXP;
ssl_prefer_server_cipher on;
listen 443;
ssl on;
ssl_certificate /usr/local/webserver/nginx/conf/vhost/ssl/server.crt;
ssl_certificate_key /usr/local/webserver/nginx/conf/vhost/ssl/server.key;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
重启nginx就可以,使用https进行访问
# nginx配置/http重定向到https
不可以把301和proxy_pass写在同一个server中,会产生重定向次数过多的问题
server {
server_name www.kunzhang.me kunzhnag.me;
if ($host = www.kunzhang.me){
return 301 https://$host/$request_url;
}
}
server {
listen 443 ssl http 1.1;
ssl_certificate /etc/letsencrypt/live/diamondfsd.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/diamondfsd.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3999;
proxy_http_version 1.1;
proxy_set_header X_FORWARDED_PROTO https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 缓冲优化
Nginx代理之后会有相应的代理缓存区,缓存区默认只有几十K,某些版本的nginx默认设置中没有相关处理,导致部分文件代理是会出现加载不全的现象,其实不仅仅是JS文件。只是因为框架的JS文件略大,所以经常出现类似问题。
在nginx.conf中添加
http {
proxy_buffer_size 128k;
proxy_buffers 32 128k;
proxy_busy_buffers_size 128k;
}
2
3
4
5
# gzip压缩
http {
# 开启gzip
gzip on;
# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
# gzip 压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间
gzip_comp_level 1;
# 进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
# 禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 错误日志
打开nginx.conf文件
vim /etc/nginx/nginx.conf
# 性能
内容缓存:允许浏览器基本上永久地缓存静态内容。 Nginx
将为您设置Expires
和Cache-Control
头信息。
设置nginx的静态文件地址
location / {
add_header Cache-Control max-age=360000;
root /usr/share/nginx/html/webrtc-sdk/dist/;
}
2
3
4
设置nginx做websocket代理
location ^~ /websocket {
proxy_pass http://192.168.40.174:31089;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
2
3
4
5
6
设置nginx最大打开文件限制
user root root;
worker_processes 4;
worker_rlimit_nofile 65535;
2
3
设置nginx拦截某个请求,并直接返回状态码
location ^~ /p/asm {
return 204 "OK";
}
2
3
设置nginx给某个路径单独的日志文件
location ^~ /p/asm {
access_log /var/log/nginx/a.log;
error_log /var/log/nginx/a.err.log;
}
2
3
4
# 警告
Starting nginx: nginx: [warn] could not build optimal proxy_headers_hash, you should increase either proxy_headers_hash_max_size: 512 or proxy_headers_hash_bucket_size: 64; ignoring proxy_headers_hash_bucket_size
nginx: [warn] could not build optimal proxy_headers_hash, you should increase either proxy_headers_hash_max_size: 512 or proxy_headers_hash_bucket_size: 64; ignoring proxy_headers_hash_bucket_size
nginx: [warn] could not build optimal proxy_headers_hash, you should increase either proxy_headers_hash_max_size: 512 or proxy_headers_hash_bucket_size: 64;
2
3
在代理中设置
proxy_headers_hash_max_size 51200;
proxy_headers_hash_bucket_size 6400;
2
# 伪静态
伪静态即是网站本身动态网页,如。php、。asp、。aspx等格式动态网页,加?参数来读取数据库内不同资料,伪静态就是做url重写操作,伪静态最主要的作用是利于seo,
location / {
rewrite c(\d+1)_(.*).html /index.php?c=user&id=$1&title=$2 last;
root /usr/share/nginx/html/sta;
index index.html index.htm index.php
}
2
3
4
5
# 资源
Https://xuexb.github.io/learn-nginx
# caddy
Caddy 是一个 Go 编写的 Web 服务器,类似于 Nginx,Caddy 提供了更加强大的功能,随着 v2 版本发布 Caddy 已经可以作为中小型站点 Web 服务器的另一个选择;相较于 Nginx 来说使用 Caddy 的优势如下:
- 自动的 HTTPS 证书申请(ACME HTTP/DNS 挑战)
- 自动证书续期以及 OCSP stapling 等
- 更高的安全性包括但不限于 TLS 配置以及内存安全等
- 友好且强大的配置文件支持
- 支持 API 动态调整配置(有木有人可以搞个 Dashboard?)
- 支持 HTTP3(QUIC)
- 支持动态后端,例如连接 Consul、作为 k8s ingress 等
- 后端多种负载策略以及健康检测等
- 本身 Go 编写,高度模块化的系统方便扩展(CoreDNS 基于 Caddy1 开发)
- ……
一键安装
curl https://getcaddy.com | bash -s personal
或者
wget -qO- https://getcaddy.com | bash -s personal
2
3
检查安装版本
which caddy
← Linux Electron开发 →