Akemi

Nginx详解

2024/06/28

nginx配置

编译安装
版本1.14

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
useradd -s /sbin/nologin www
wget https://nginx.org/download/nginx-1.14.2.tar.gz
tar -xf nginx-1.14.2.tar.gz
cd nginx-1.14.2/
./configure \
--user=www \
--group=www \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/subsys/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-pcre
make
make install

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
nginx信号指令:
QUIT 处理完请求之后关闭
HUP 重新加载配置
USER1 重新打开一个日志文件,比如每天生成一个日志文件
USER2 平滑升级可执行程序
WINCH 优雅关闭

/usr/local/nginx/sbin/nginx -t #检查配置文件
/usr/local/nginx/sbin/nginx -v # 查看详细信息
killall5 nginx # 关闭所有nginx进程
/usr/local/nginx/sbin/nginx # 启动nginx

发送信号
kill -HUP 父进程pid # HUP重启

kill -HUP 'cat /usr/local/nginx/logs/nginx.pid'

Nginx配置文件nginx.conf
一共有五个部分:
main(全局),events(网络连接相关),http(缓存、代理、第三方模块),server(虚拟主机),location(处理规则)

全局配置

1
2
3
4
5
6
7
worker_processes 工作进程数,一般和核心数一致,也可以写auto
worker_cpu_affinity 根据CPU核心数对应,4核为0001 0010 0100 1000
error_log 错误日志位置
pid 存储pid的文件位置
worker_rlimit_nofile 一个nginx可以打开的最大文件数,受ulimit限制
events 设置nginx工作模式,包括epoll(首选) select poll
events-worker_connections 定义每个进程的最大连接数,默认1024(最大客户端连接数为进程数*最大连接数

http配置项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
include 主模块指令,后面跟一个子配置文件
default_type 默认类型为二进制流。如果未定义,访问html时就会不予解析
log_format 指定nginx日志的输出格式,并且在后面可以引用输出格式
access_log 访问日志位置(全局)
sendfile 开启高效文件传输模式。tcp_nopush tcp_nodelay设置为on
keepalive_timeout 客户端保持连接 的超时时间,超时就关闭连接
#优化选项
server_names_hash_bucket_size 散列桶占用内存大小(越大越好),提高寻找servername的能力,一般设置128
client_max_body_size 客户端请求的最大单个文件字节数,例如客户端上传100M文件传不上去
client_header_bugger_size 设置客户端消息头缓冲区大小。如 32k
large_client_header_buffers 指定客户端请求中较大的消息头缓存数量和大小,比如 4 32k

#http giz模块配置项
gzip on是否启动gzip模块,实时压缩输出数据流
gzip_min_length 1k 允许压缩的页面最小字节数,为0就是都压缩,一般设置为1k
gzip_buggers 4 16k 设置压缩流缓存大小 4个16k的内存大小,默认申请与原始数据相同大小的内存
gzip_http_version 1.1 设置识别http协议的版本
gzip_comp_level 2 gzip压缩比,1压缩比最小、处理速度最快,9压缩比最大、处理速度慢
gzip_types 指定用来压缩的类型,如text/plain。其中text/html必定被压缩

server配置项

1
2
3
4
5
6
7
server 虚拟主机开始的关键字
listen 虚拟主机服务端口
server_name 指定ip或域名
index 默认nginx首页地址
root 指定虚拟主机网站根目录
access_log 访问日志位置(局部)
error_page 错误信息的返回页面,默认会在html目录中寻找指定页面

nginx使用http模式

1
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
user www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
error_log logs/error.log notice;
pid /var/run/nginx.pid;
worker_rlimit_nofile 65536;

events {
use epoll;
worker_connections 4096;
}

http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr $upstream_addr - [$time_local] $status';
access_log logs/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
server_names_hash_bucket_size 128;
client_max_body_size 20m;
client_header_buffer_size 32k;
largeclient_header_buffers 4 32k;

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;

server {
listen 80;
server_name localhost;

access_log logs/host.access.log main;

location / {
root html;
index index.html index.htm;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

nginx中的正则与匹配规则

1
2
3
4
5
6
7
8
9
10
11
12
~   区分大小写
*~ 不区分大小写
!~ 区分大小写 不匹配
!~* 不区分大小写 不匹配
-f 文件是否存在
!-f 文件是否存在 取反
-d 目录是否存在
!-d 同上
-e 文件或目录是否存在
!-e 同上
-x 是否可执行
!-x 同上

location规则与优先级
location 对URL进行匹配,支持正则也支持条件判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#所有结尾名为...的这些个请求,去下面目录下寻找这个文件。比如,要下载一个东西的链接,
location ~ .*(gif|jpg|jpeg|png|bmp|swf)$ {
root /data/www/www.ws.net;
}

#匹配以/upload或/html为开头的URL
location ~ ^/(upload|html)/ {
root /data/
}
#匹配(过滤)以jsp结尾的请求,并将其转到8080端口处理
location ~ .*jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
}

注:如果定义了多个location,正则的location优先级高于/的location
location优先级:(从高到低)
location = [正则]精准匹配
location ^~ /images/ [正则]匹配所有以/image开头的
location ~* \.jpg$ [正则]\是转义字符,~*不区分大小写,匹配以jpg结尾的
location /def/def [普通]路径(更细致)
location /abc [普通]路径
location / [普通]所有请求

nginx使用反向代理模式

nginx使用proxy_pass模块实现反向代理

1
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
简单示例:
server {
listen 80;
server_name www.xxx.com;

location / {
proxy_pass http://192.168.10.100;
}
}

部分代理(1):
server {
server_name xxxx;
#只针对对xxxx/qwe的访问
location /qwe/ {
proxy_pass http://192.168.100.100:8000;
# 会代理到192.168.100.100:8000/xxxx/qwe
}
}
部分代理(2):
server {
server_name 192.168.100.101;
location /xxxx/ {
proxy_pass http://192.168.100.100:8000/yyyy/;
# 192.168.100.101:8000/xxxx/qwe会代理到192.168.100.100:8000/yyyy/qwe
}
}
部分代理(3):
server {
server_name 192.168.100.101;
location /xxxx/ {
proxy_pass http://192.168.100.100:8000/;
# 192.168.100.101:8000/xxxx/qwe会代理到192.168.100.100:8000/qwe
}
}
反向代理优化参数
也可以将其放到单独的文件,然后用include进行引用即可
server {
listen 80;
server_name www.xxx.com;
location / {
#关闭http重定向
proxy_redirect off;
#使后端服务器获得客户端的ip地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set header X-Foewarded-For $proxy_add_x_forwarded_for;
#连接超时时间
proxy_connect_timeout 90;
#传数据传不完,断开
proxy_send_timeout 90;
proxy_read_timeout 90;
#缓冲区大小
proxy_buffer_size 4k;
proxy_buffers 4 32k;
#繁忙时可用缓冲区的大小
proxy_busy_buffers_size 64k;
#缓存文件的大小
proxy_temp_file_wirte_size 64k;

proxy_pass http://192.168.10.100;
}

nginx URL重写

nginx内置变量

1
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
31
$args/query_string 请求的参数
$document_root root指定的值、资源路径,或虚拟主机的根目录
$uri/document_uri 不带参数的当前URI,不包含主机名
$host 与请求头中的host一致
$limit_rate 限制连接速度
$request_method 等同于http的request方法,比如GET或POST
$remote_addr 客户端ip地址
$remote_port 客户端端口
$remote_user 一般没有
$request_filename 当前请求文件的完整路径名
$request_uri 含有参数的完整初始URI,由客户端请求决定
$server_addr 请求的服务器的地址
$server_name 请求的服务器的主机名
$server_port 到达的服务器的端口号

举例:
http://192.168.10.100:8000/abc?test=123&test2=abc
$args: test=123&test2=abc
$uri: /abc
$server_addr: 192.168.10.100
$server_port: 8000
$request_filename: abc
$request_uri: /abc?test=123&test2=abc

http://192.168.10.100:9000/test1/test2/test.php
$host: 192.168.10.100
$server_port: 9000
$request_uri: /test1/test2/test.php
$document_uri: /test1/test2/test.php
$document_root: /var/www/html
$request_filename: /var/www/html/test1/test2/test.php

if指令
在server与location中使用
if指令用于判断一个条件,如果条件成立,则后面的大括号内的语句将执行,相关配置从上级继承。
语法:if (condition) { … }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
例:
server {
...
location / {
root /var/www/html;
#如果目标文件不存在
if (!-f $request_firename)
{
root /var/www/error/html
}
if (!-f $request_firename)
{
# 重定向到404页面
root /var/www/error/404.html
}
}
}

rewrite指令
Nginx通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但要使用rewrite功能,需要PCRE支持,应在编译nginx时指定PCRE源码目录

1
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
31
32
33
34
35
36
37
38
语法:rewrite re正则 标记flag
常用标记:
last 完成rewrite后会继续搜索URI和location,用来实现URL重写
break 终止匹配,用来实现URL重写
redirect 返回302临时重定向,浏览器URL会变化
permanent 返回301永久重定向,浏览器URL会变化~

简单示例:
location ~^ /new/ {
#重写 重写正则 重写后 标记
#$1就是前面那个值
rewrite ^/new/(.*)$ /oid/$1 break;
proxy_pass http://www.ws.com;
}
此时如果访问的是www.ws.com/new/html时,就会被自动重定向为www.ws.com/old/html

示例:重定向到百度
server {
listen 80;
server_name www.wangsheng.com;
rewrite ^/(.*) http://www.baidu.com/$1
}

server {
listen 80;
server_name www.wangsheng.com;
return 301 http://www.baidu.com/$request_uri;
}


示例:重定向成https协议
server {
listen 80;
server_name www.wangsheng.com;
rewrite ^/(.*) https://www.wangsheng.com
}


set指令
用来设置一些临时变量并为之赋值。语法:set variable value

1
2
3
4
5
6
7
8
9
10
11
例:
location / {
# 如果`$query_string`是 `?id=123&name=john`,那么`$query_string ~ "id=(.*)"`会返回`true`,因为`id=`后面跟了至少一个字符。
if ($query_string ~ "id=(.*)") {
set $myid $1;
# 伪装成一个静态的网页,永久重定向(浏览器URI会变化)
rewrite ^/app.php$/m-$myid.html? permanent;
}
}
将请求www.abc.com/app.php?id=100 重定向到www.abc.com/m-100.html
使用nginx的一个内部变量$query_string,这样在重写的时候只需把$query_string变量追加到重写的uri后面即可,另外,为了防止uri中的参数追加到重写后的uri上,需要在rewrite最后加个问号

break指令
适用于server、location、if中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
在if中的例子:
server {
listen 80;
server_name www.abc.com;
if ($host!='www.abc.com')
{
# 如果找不到,一概重定向到error界面
rewrite ^/(.*)$ http://www.abc.com/error.html
# 退出if,就不会执行下面这个rewrite
break;
# 如果host是www.abc.com,就会跳过上面这个,直接执行下面这句
rewrite ^(.*)$ http://www.abc.com/$1 permanent;
}
}

nginx负载均衡(upstream模块)

支持四种调度算法:轮询(weight)、ip_hash(按访问ip的hash结果分配)、fair(upstream_fair模块)、url_hash(按访问URL的hash结果分配)

1
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
31
32
33
34
35
36
37
38
39
40
状态参数:
down 表示当前server不参与负载均衡
backup 预留,当所有非backup出现问题或忙时会使用备用
max_fails 允许请求失败次数,默认为1
fail_timeout ↑请求失败后,服务暂停时间

例:使用权重 轮询
http{
...
}
# 定义一个负载均衡组(后端服务器组)
upstream apiserver{
server 192.168.10.121:6443 weight=3 max_fails=3 fail_timeout=20s;
server 192.168.10.122:6443 weight=3 max_fails=3 fail_timeout=20s;
server 192.168.10.123:6443 weight=3 max_fails=3 fail_timeout=20s;
}
server {
listen 9000;
server_name www.k8sapiserver.com 192.168.10.100;
location / {
#反向代理到后端服务器组
proxy_pass http://apiserver;
#加一些配置
include /usr/local/nginx/conf/proxy.conf;
}
}

例:使用hash
upstream apiserver {
server 192.168.10.121:6443 max_fails=3;
server 192.168.10.121:6443 max_fails=3;
ip_hash;
}
server {

location / {
proxy_pass http://apiserver;

}
}

nginx错误日志自定义配置

错误日志位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
可以在编译的时候指定
--error-log-path=/usr/local/nginx/logs/error.log
也可以在nginx.conf中指定(全局配置)
error_log 错误日志位置+级别

错误日志级别从高到低: (常识补充)
emerg 紧急情况,最高级别
alert 需要立即处理的错误
crit 极为严重的错误(英文单词是暴击的意思)
error 严重错误,会影响程序运行
warn 警告、一般不会影响运行
info 显示重要信息
debug 调试级别,最低级

比如可以这么配置
error_log /usr/local/nginx/logs/error.log error;
error_log /usr/local/nginx/logs/warning.log warn;
error_log /usr/local/nginx/logs/notice.log notice;

自定义日志log_format

默认配置的情况下,所有网站的日志都会放到一块混在一起

所以需要分开,把每个网站的日志分开来

并且可以自定义日志格式

1
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
将nginx.conf中日志位置删除
并添加自定义的日志格式,名字为main
(这个最好放http的最前面,确保其比子配置文件更早被解析到)
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
其中的变量是nginx的预定义变量
# $remote_addr: 客户端的IP地址
# $remote_user: 用于HTTP基本认证的用户名
# $time_local: 记录请求的本地时间,格式为 'day/month/year:hour:minute:second +时区'
# $request: 请求行,例如 "GET /somefile.html HTTP/1.1"
# $status: HTTP响应状态码,例如 200 表示成功,404 表示未找到
# $body_bytes_sent: 发送给客户端的响应体字节数
# $http_referer: 记录网站地址信息
# $http_user_agent: 用的是什么浏览器
# $http_x_forwarded_for: 反向代理中,客户端真实IP

cat conf/nginx.conf
worker_processes 4;
events {
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"';
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include /usr/local/nginx/conf/vhost/*.conf;
}

在子配置文件中,引用日志格式main,并定义日志位置
mkdir -p /var/log/wangsheng/
cat conf/vhost/wangsheng.conf
server {
listen 80;
server_name www.wangsheng.com;
access_log /var/log/wangsheng/access.log main; <-引用main格式
location / {
root html/wangsheng;
autoindex on;
}
location =/status {
stub_status;
}
}

nginx -t
nginx -s reload

测试:
tail -f /var/log/wangsheng/access.log
测试机连接
for i in {1..50}; do curl www.wangsheng.com; done

192.168.10.102 - - [14/Aug/2024:20:17:29 +0800] "GET / HTTP/1.1" 200 265 "-" "curl/7.29.0" "-"
192.168.10.102 - - [14/Aug/2024:20:17:29 +0800] "GET / HTTP/1.1" 200 265 "-" "curl/7.29.0" "-"
192.168.10.102 - - [14/Aug/2024:20:17:29 +0800] "GET / HTTP/1.1" 200 265 "-" "curl/7.29.0" "-"

nginx配置https

https就是http+ssl/tls证书
一般SSL证书都是通过第三方进行颁发的证书
1.增强型SSL证书(EV SSL) 级别最高的证书,一般电商网站和银行金融类网站;会显示单位名称(绿色)
2.机构验证型SSL证书(OV SSL),一般企业网站,会显示单位名称
3.个人验证型SSL证书(IV SSL),个人网站使用,显示个人姓名
4.域名验证型SSL证书(DV SSL),最基础的SSL证书
获取一个SSL证书
配置HTTPS需要提供三个文件
1.私钥.key——由证书申请者生成
2.证书签署请求文件.crs——由证书申请者生成,包含申请者的信息,公钥信息。提交给CA
3.证书文件.crt——经CA处理后,返回的证书文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 使用openssl生成key和crs
openssl req -new -newkey rsa:2048 -sha256 -nodes -out nginx.csr -keyout nginx.key -subj "/C=CN/ST=beijing/L=beijing /O=nginx Inc./OU=Web Security/CN=wangsheng.com"
C 国家
ST 州/省
L 城市
O 组织/单位
OU 下属部门/相关信息
CN 域名

生成完之后会生成以下两个文件
nginx.csr nginx.key

在网上平台搞个免费的DV证书
证书验证方式有:
1.根域网站验证:在根域名网站下创建html文件(常用)
2.根域dns解析:设置根域名的TXT记录值(常用)
3.根域邮箱验证:送过发邮件的方式

验证完之后就可以下载crt文件了

nginx下配置ssl证书

1
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
server
{
listen 443;
server_name wangsheng.com;
index index.php index.html;
root /data/
ssl on;
ssl_vertificate nginx.crt;
ssl_vertificate_key nginx.key;
#加密套件
ssl_prefer_server_ciphers on;
#加密协议指定,一般就这三种,要确保openssl版本大于1.0.1
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#加密套件和算法,一般选择默认
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !IDSS !RC4";
#安全性的选项,表示减少点击劫持
add_header X-Frame-Options DENY;
#安全性的选项,表示禁止服务器自动解析资源类型
add_header X-Content-Type-Options nosniff;
#安全性的选项,表示防止XSS攻击
add_header X-Xss-Protection 1;
}

#验证https是否安全的方法——通过工具网站进行检测
[https://myssl.com/](https://myssl.com/)
[https://www.ssllabs.com/ssltest/](https://www.ssllabs.com/ssltest/)

搭建一个lnmp

1
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
环境:
centos7.9
nginx 1.14.2
mysql 5.7.44

1.源码编译安装nginx
yum -y update
useradd -s /sbin/nologin www
wget https://nginx.org/download/nginx-1.14.2.tar.gz
tar -xf nginx-1.14.2.tar.gz
cd nginx-1.14.2/
#编译安装,可以指定openssl源码包的路径,已经安装就不用了
./configure \
--user=www \
--group=www \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/subsys/nginx \
# --with-openssl=/app/openssl-1.0.2k \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-pcre
make
make install

#检查
/usr/local/nginx/sbin/nginx -V

2.安装mysql
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.44.tar.gz
tar -xf mysql-boost-5.7.44.tar.gz

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/db/data \
#字符集与规则
-DDEFAULT_CHARSET=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
#存储引擎选择
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
#指定用户、端口
-DMYSQL_USER=mysql \
-DMYSQL_TCP_PORT=3306 \
#boost库的路径
-DWITH_BOOST=boost \
#允许从本地导入数据
-DENABLED_LOCAL_INFILE=1 \
#支持数据库分区
-DWITH_PARTITION_STORAGE_ENGINE=1 \
#指定连接套接字
-DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \
#启用嵌入式服务器
-DWITH_EMBEDDED_SERVER=1
make
make install

3.初始化mysql
mysql的启动需要一个默认系统库mysql
mkdir -p /db/data
chown -R mysql:mysql /db/data/

--initialize-insecure 表示初始化时不生成管理员密码
--initialize 表示初始化时生成随机密码(/var/log/mysqld.log)
--user 指定初始化的用户
--basedir 指定主程序的安装目录(参考编译安装的时候目录)
--datadir 指定主程序的数据目录(参考编译安装的时候目录)

cat /var/log/mysqld.log
能看到初始化密码is&eDDa>V5rO

4.配置mysql配置文件my.cnf
在mysql启动服务的时候会查找该文件:
首先在/etc/my.cnf找,其次会在$basedir/my.cnf下寻找,最后会在~下寻找
建议删除/etc/my.cnf(老的)

例:最简单的配置文件
[mysqld]
datadir=/db/data
socket=/tmp/mysqld.sock
symbolic-links=0
log-error=/var/log/mysqld.log
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

启动mysql
/usr/local/mysql/support-files/mysql.server

5.配置mysql启动脚本
mysql自带启动脚本,将其复制进init.d就行
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig mysqld on

6.登录与修改密码
/usr/local/mysql/bin/mysql -uroot -p
mysql> SET PASSWORD = PASSWORD('123456');
mysql> ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
mysql> flush privileges;


7.源码编译安装php7
版本7.1.14
yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel curl curl-devel openssl openssl-devel
tar -xf php-7.1.14.tar.gz
cd php-7.1.14
# 编译选项
--with-pdo-mysql=mysqlnd # 定义了php与mysql的方式
pdo(PHP Data Objects)提供了一个统计接口使php与数据库进行交互
mysqlnd(mysql native driver)由php官网提供的mysql驱动连接代码
--with-mysqli=mysqlnd # mysql增强扩展

./configure --prefix=/usr/local/php7 --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-zlib --with-curl --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-openssl --enable-mbstring --enable-xml --enable-session --enable-ftp --enable-pdo -enable-tokenizer --enable-zip
make
make install

php-fpm是第一个第三方的FastCGI进程管理器。包含master和worker进程,多个worker进程。每个worker进程内部都嵌了一个PHP解释器
Nginx提供了一个FastCGI模块来将http请求映射为对应的FastCGI请求,这样,Nginx就可以将请求发送给PHP-FPM了,也就实现了Nginx与PHP-FPM的集成。

8.php7配置文件
cd /usr/local/php7/etc
cp php-fpm.conf.default php-fpm.conf #主配置文件
cd php-fpm.d/
cp www.conf.default www.conf #子配置文件

[www]
user = www
group = www
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 100
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 50

user和group用于设置运行php-fpm进程的用户和用户组。
listen是配置php-fpm进程监听的IP地址以及端口,默认是127.0.0.1:9000
pm.max_children用于设置php-fpm的进程数。
pm:指定php-fpm进程池开启进程的方式,有两个值可以选择,分别是static(静态)和dynamic(动态)。
pm.max_children:在static方式下,固定开启的php-fpm进程数量,在dynamic方式下最大进程数。
pm.start_servers:表示在dynamic方式下初始开启php-fpm进程数量。
pm.min_spare_servers:表示在dynamic方式空闲状态下开启的最小php-fpm进程数量。
pm.max_spare_servers:表示在dynamic方式空闲状态下开启的最大php-fpm进程数量,这里要注意pm.max_spare_servers的值只能小于等于pm.max_children的值。

./php-fpm

9.配置nginx转发给php
vim /usr/local/nginx/conf/nginx.conf
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name;
include fastcgi_params;
}
./nginx

创建php的网页文件
cd /usr/local/nginx/html/
vim phpinfo.php
<? php phpinfo() ?>

网页访问:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
10.测试php连接mysql数据库
# mysqli方法
vim /usr/local/nginx/html/php_test-1.php
<?php $conn = mysqli_connect("192.168.10.100", "root", "mysql_abc123", "mysql");
if (!$conn) {
die("数据库连接错误: " . mysqli_connect_error());
} else {
echo "数据库连接成功";
}
mysqli_close($conn); // 关闭数据库连接 ?>

# pdo方法
vim /usr/local/nginx/html/php_test-2.php
<?php
try {
$pdo = new PDO('mysql:host=192.168.10.100;dbname=mysql', 'root', 'mysql_abc123');
// 设置错误模式为异常
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo "数据库连接错误: " . $e->getMessage();
}
// 只有在try块没有抛出异常时,才会执行到这里的echo语句
echo "数据库连接成功";
?>

因为我忘记做mysql账号的访问策略了所以没通,但是实际上已经是能够访问的状态了

nginx+tomcat

tomcat常用作java容器,擅长处理动态请求,但无法抗高并发
nginx擅长处理静态请求,并且可以处理高并发,可以做反向代理
两种整合方式:
1.动静分离:
将静态界面交给nginx,动态请求交给后端tomcat。只能针对非高并发的场景
2.负载均衡:
通过nginx反向代理和负载均衡,转发给后端tomcat
实际场景中,会使用cdn(比如cloudflare)来缓存静态资源,如果没有再访问源站服务器

动静分离

1
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
server {
listen 80;
server_name www.abc.com;
root /web/www/html;
# 静态文件,直接交给本地目录处理
location /image/ {
alias /web/www/html/image/;
}

# .jsp和.do结尾的动态文件代理到后端
location ~ (\.jsp)|(\.do)$ {
proxy_pass http://192.168.10.100:8080;
proxy_redirect off;
}

# 一些优化选项
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        client_max_body_size 10m;
        client_body_buffer_size 128k;
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
        proxy_buffer_size 4k;
        proxy_buffers 4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
}

alias和root的区别

1
2
3
4
5
6
7
8
9
location  /i {     # 请求www.abc.com/i/123.gif
alias  /var/www/html/images/;   #实际查找/var/www/html/images/123.gif
}
用alias后面的目录完全替代/i,/i这个路径会被自动丢弃

location  /i {  # 请求www.abc.com/i/123.gif
root  /var/www/html/images/;   #实际查找/var/www/html/images/i/123.gif
}
用root后面的目录追加/i,会追加上去

反向代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 定义后端服务器组
upstream tomcatserver {
server 192.168.10.100:8080 max_fails=3 fail_timeout=20s;
server 192.168.10.101:8080 max_fails=3 fail_timeout=20s;
server 192.168.10.102:8080 max_fails=3 fail_timeout=20s;
ip_hash;
}

server {
listen 80;
server_name www.abc.com;
}
# 静态资源
location ~* \.(jpg|mp3|rar|zip|png)$ {
root /web/www/html/;
}
# 动态资源
location / {
proxy_pass http://tomcatserver;
include /usr/local/nginx/conf/proxy.conf;
}
CATALOG
  1. 1. nginx配置
    1. 1.1. nginx使用http模式
    2. 1.2. nginx使用反向代理模式
    3. 1.3. nginx URL重写
    4. 1.4. nginx负载均衡(upstream模块)
    5. 1.5. nginx错误日志自定义配置
    6. 1.6. nginx配置https
  2. 2. 搭建一个lnmp
  3. 3. nginx+tomcat
    1. 3.1. 动静分离
    2. 3.2. 反向代理