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的预定义变量 cat conf/nginx.confworker_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.confserver { 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; }