惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿
博客园_首页
Last Week in AI
Last Week in AI
月光博客
月光博客
有赞技术团队
有赞技术团队
IT之家
IT之家
博客园 - Franky
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 三生石上(FineUI控件)
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
云风的 BLOG
云风的 BLOG
WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
人人都是产品经理
人人都是产品经理
A
About on SuperTechFans
N
Netflix TechBlog - Medium
雷峰网
雷峰网
Recorded Future
Recorded Future
S
Securelist
C
CERT Recently Published Vulnerability Notes
Vercel News
Vercel News
F
Full Disclosure
C
Cybersecurity and Infrastructure Security Agency CISA
A
Arctic Wolf
Simon Willison's Weblog
Simon Willison's Weblog
L
LINUX DO - 热门话题
T
Tenable Blog
MongoDB | Blog
MongoDB | Blog
V
Visual Studio Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Jina AI
Jina AI
TaoSecurity Blog
TaoSecurity Blog
H
Hacker News: Front Page
D
DataBreaches.Net
Google DeepMind News
Google DeepMind News
T
The Exploit Database - CXSecurity.com
S
Security @ Cisco Blogs
W
WeLiveSecurity
酷 壳 – CoolShell
酷 壳 – CoolShell
D
Darknet – Hacking Tools, Hacker News & Cyber Security
SecWiki News
SecWiki News

atpX

自建 S3 兼容对象存储服务 Garage 听风的歌 偶尔是深夜就好了 新玩具 AirPods Pro 3 公交车上的时间 从 WHOIS 到 RDAP 通过 WireGuard 访问 NFS 共享文件 自建音乐串流服务探索 我停止了探索 Fediverse 互联网背景噪音 我的数字生活降级 小城与确定性的墙 一只特立独行的猪 Fediverse 与社交 承认的勇气 mediaX - 轻量书影音记录管理工具 我的博客写作流程 网站新增 Misc 页面 擅长对线的鲍勃 在 Chroot 环境下使用 Rsync 同步 再见 JavaScript 当我玩博客时我在玩什么 为什么我的博客没有友链页面 小熊猫与大熊猫 (HDR 照片测试) 是时候为网站开启 HTTP/3 支持了吗 使用 AdGuard Home 搭建自用 DoH 服务 谈谈读书与消遣 2023 年终总结 西安两日游 从 AirPods「升级」到 EarPods Docker 搭建去中心化的微博客平台 Mastodon 聊聊 iPhone 15 Pro 使用感受 能否将 TOTP 二次验证存放在密码管理器里 认识史蒂夫·乔布斯 与“锤哥”克里斯·海姆斯沃斯一起养生 逃离爆炸的信息 你想活出怎样的人生 重温《龙珠》动画 为什么关闭评论 从域名注册商到 DNS 服务,找到自己的组合 如何提高用户网页阅读体验 从 Typecho 迁移到 Hugo 个人博客的最终归宿是静态网站吗 我选择了放弃 jQuery 关于我的小破站折腾速度优化这件事 记一次家庭网络折腾 贴一些 SmokePing 记录 我的域名邮箱选择 不存在的语录 Typecho 评论验证插件 CaptchaPlus 谈谈写字这件事 新的网站 Logo 探索 曲线解决 Typecho 图片占位抖动问题 自建 vaultwarden / bitwarden_rs 密码管理器 使用 Plausible 自建网站流量统计分析工具 如何优雅地徒手剥开火腿肠 简单的集中隔离生活记录 新玩具 M2 MacBook Air 使用 acme.sh 申请 Google 公共证书 Docker 搭建去中心化的微博客平台 Misskey 搭建 Lsky Pro 兰空图床 折腾树莓派系统的一天 我的吉卜力之旅 使用 Uptime Kuma 自建服务器/网站在线率监控 Spartan Host Review - Best Hosting & Service Support Debian 下 Nginx 配合 Fail2Ban 减少恶意扫描和攻击 升级 Typecho 到最新开发版本 v1.2.0 Linux rm 命令详解 Debian 系统安装 Docker 教程 BandwagonHost - Reliable Blog and Business VPS Hosting 使用 Isso 为 Hugo/Hexo 等静态网站添加评论功能 推荐 5 款免费开源的网站流量分析统计工具 搭建 Shynet 网站流量统计分析工具 聊聊 DDoS 攻击那些事 Hugo 使用 Fancybox 实现图片灯箱/放大功能 从 Debian 10 升级到 Debian 11 教程 使用 Umami 自建网站流量统计分析工具 Linux 一次执行多个命令的 3 种方式 Typecho 修改永久链接后旧链接 301 跳转到新链接 从不同需求推荐几家稳定可靠的 VPS 服务商 Build EchoIP service with Docker 浅谈一下这些年折腾过的 VPS 单线复用解决一根网线同时 IPTV 和宽带问题 不完全吃灰的树莓派 开发一个自己的 Telegram Bot 使用 Nginx 实现 TCP 四层反向代理 画画真难 我读村上春树 使用 acme.sh 自动签发和更新证书 卡拉马佐夫式悲剧 安装 File Browser 轻量网盘工具 新玩具树莓派到手 Linux 定时自动备份数据到 OneDrive/Google Drive 记一次服务器崩溃 使用 rsync 同步文件 短信的消失 幻灭的艺术家 新玩具戴尔 S2721DGF 开箱 蝴蝶 用 Docker 整合 SeafilePro 搭建私人云盘
安装并配置 LNMP 的记录
ATP · 2020-05-31 · via atpX

以前都是用一键脚本部署,如今心血来潮,准备在 CentOS/Debian 下手动搭建主流的 LNMP 架构,就当消磨本没有的时间🙃

配置 Nginx

如果你已经编译安装过 Nginx 了,这里直接配置,将 Nginx 添加到系统服务:

CentOS: vim /usr/lib/systemd/system/nginx.service

Debian: vim /lib/systemd/system/nginx.service

[Unit]
Description=Nginx - High Performance Web Server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
Wants=network-online.target
 
[Service]
Type=forking
PIDFile=/etc/nginx/logs/nginx.pid
ExecStartPre=/etc/nginx/sbin/nginx -t -c /etc/nginx/conf/nginx.conf
ExecStart=/etc/nginx/sbin/nginx -c /etc/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

启动服务:

systemctl daemon-reload
systemctl enable nginx.service
systemctl start nginx.service

如果你使用的是 Deabin 系统,也可以用我写的一键脚本编译安装 Nginx,以 root 用户运行:

bash <(curl -Ls git.io/nginx.sh)

修改下配置,转发到 PHP 默认的 9000 端口,此处以单 http 网站示例:

server {
    ...
    location ~ .php$ {
        fastcgi_pass   127.0.0.1:9000;
        # 如果是 php-7.4:fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

安装 MySQL

CentOS 下安装

1. 更新 MySQL 源

这里选择 8.0 版本的 MySQL,或者 5.7 版本,首先

wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

安装 MySQL 源:

yum localinstall mysql80-community-release-el7-3.noarch.rpm

如果之后不想通过 yum update 的时候更新 MySQL,安装完成后卸载即可:

yum -y remove mysql80-community-release-el7-3.noarch.rpm

用下面的命令检查 MySQL 源是否安装成功

syum repolist enabled | grep "mysql.*-community.*"

2. 安装 MySQL

使用 yum install 命令安装:

yum install -y mysql-community-server

启动命令:

systemctl start mysqld

*查看已安装的 MySQL:

rpm -qa | grep -i mysql

导出数据库:

mysqldump -u 用户名 -p 数据库名 > 文件名.sql

导入数据库:

mysql -u 用户名 -p 数据库名 < 文件名.sql

卸载MySQL:

yum remove mysql-community-server

卸载依赖:

yum remove mysql-libs
yum remove mysql-server
yum remove perl-DBD-MySQL
yum remove mysql

同时建议清空数据文件。

Debian 下安装

这里以安装 MySQL 8 作为演示,添加最新的 apt 存储库

wget https://dev.mysql.com/get/mysql-apt-config_0.8.20-1_all.deb
apt install ./mysql-apt-config_0.8.20-1_all.deb

安装 MySQL:

apt update
apt install mysql-server

配置 MySQL

登录 MySQL

如果你安装的是 MySQL5.7 版本,安装完后会生成一个默认密码保存在 /var/log/mysqld.log 文件中,通过下面的命令找到密码:

grep 'password' /var/log/mysqld.log

然后进入 MySQL 修改 root 密码

mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

而如果你是安装 MySQL8.0 之后的版本,会在安装时提示你输入 root 用户密码,做好保存即可。

管理 MySQL

创建 MySQL 数据库和用户

CREATE DATABASE [数据库名];
CREATE USER '用户名'@'localhost' IDENTIFIED BY '密码';
GRANT ALL ON [数据库名].* TO '用户名'@'localhost';
FLUSH PRIVILEGES;

默认只允许 root 帐户在本地登录,若要远程操作 MySQL,建议添加远程登录用户而不是直接修改 root 账户为远程连接, 添加一个允许远程连接的帐户:

GRANT ALL PRIVILEGES ON [数据库].[数据表] TO '用户名'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;

查看所有用户及权限:

SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user; 

撤销权限:

revoke all privileges on *.* from 'user'@'%';

优化 MySQL

设置默认编码为 UTF-8,MySQL5.7 安装后默认不支持中文,需要修改编码。修改 /etc/my.cnf 配置文件如下:

[mysqld]
character_set_server=utf8
collation-server=utf8_general_ci

重启 MySQL 服务,登录后可查看目前的编码格式:

systemctl restart mysqld
mysql -uroot -p
show variables like 'character%';

#可是远程连接的时候一直失败,心态小炸QAQ,查看日志发现:

[Warning] IP address 'xxxx' could not be resolved: Name or service not known

因为 MySQL 默认会反向解析 DNS,对于访问者 MySQL 不会判断是 hosts 还是 ip 都会进行 dns 反向解析,频繁地查询数据库和权限检查,这大大增加了数据库的压力,导致数据库连接缓慢。

解决办法:禁用 dns 反查,确保 skip-networking 被删除或者屏蔽,否则不支持 TCP/IP 访问,编辑 /etc/my.cnf 加入以下内容:

[mysqld]
skip_host_cache
skip-name-resolve=1

优化内存占用

修改 /etc/mysql/mysql.conf.d/mysqld.cnf 文件:

# 以下为针对1G内存优化
# 指定用于索引的缓冲区大小
key_buffer_size = 32M

# Innodb缓存
innodb_buffer_pool_size = 128M

# 日志文件所用的内存大小,缓冲区更大能提高性能,但意外的故障将会丢失数据。建议设置为1-8M之间
innodb_log_buffer_size = 4M
innodb_log_file_size = 48M

# 关闭性能监控,大幅减低内存占用
performance_schema=off

# 指定MySQL允许的最大连接进程数,默认值为 151
max_connections = 200

# 查询排序时所能使用的缓冲区大小
sort_buffer_size = 1M

# 读查询操作所能使用的缓冲区大小
read_buffer_size = 512K

安装 PHP

CentOS 下安装

更新 PHP 源

Remi 软件源主要提供最新版的PHP软件包和其他一些 PHP 扩展工具包,Remi 对 PHP 的支持和更新都很积极,可以在第一时间获得新版本的支持。

安装 EPEL 源及源管理工具:

yum install epel-release yum-utils

安装 REMI 源:

yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

安装 PHP7.3 及扩展:

yum install -y php73-php-fpm php73-php-cli php73-php-bcmath php73-php-gd php73-php-json php73-php-mbstring php73-php-mcrypt php73-php-mysqlnd php73-php-opcache php73-php-pdo php73-php-pecl-crypto php73-php-pecl-mcrypt php73-php-pecl-geoip php73-php-pecl-swoole php73-php-recode php73-php-snmp php73-php-soap php73-php-xmll

查看状态:

systemctl status php73-php-fpm

将 php73 链接到系统环境变量中,就可以使用 php -v 命令:

ln -s /opt/remi/php73/root/usr/bin/php /usr/bin/php

默认配置文件路径为:/etc/opt/remi/php73/php.ini

卸载 PHP7.x:

yum -y remove php7* 

Debian 下安装

Debain 10 默认自带了 PHP7.3(Debian 11 为 PHP7.4,Debian 12 为 PHP8.2),可通过下面命令查看:

apt-cache search php7.3
# 或者
apt-cache search php7.4

安装 PHP8.2:

apt install -y php8.2 php8.2-cli php8.2-common php8.2-fpm php8.2-xml php8.2-curl php8.2-mysql php8.2-sqlite3 php8.2-mbstring php8.2-gd php8.2-fileinfo php8.2-exif

若系统不支持当前版本,可以导入 Sury 仓库:

curl -sSL https://packages.sury.org/php/README.txt | bash -x

再安装 PHP8.2:

apt install -y php8.2 php8.2-cli php8.2-common php8.2-fpm php8.2-xml php8.2-curl php8.2-mysql php8.2-sqlite3 php8.2-mbstring php8.2-gd php8.2-fileinfo php8.2-exif

查看状态:

systemctl status php8.2-fpm

默认配置文件路径为:/etc/php/8.2/fpm/php.ini

卸载 PHP8.x:

apt purge php8.*
apt autoclean
apt autoremove

配置 PHP

查找配置文件路径:

php -i  | grep php.ini

如果你 Nginx 默认用户不是 www-data,需要修改 php-fpm.d(PHP8.2 路径为 /etc/php/8.2/fpm/pool.d)下 www.conf 文件将用户和用户组修改为与 nginx.conf 中的一致。

ps aux | grep php 可以查看进程使用的用户身份。

*修改 PHP 运行最低内存

vim /etc/php/8.2/fpm/php.ini

更改 memory_limit = 512M

*将 cgi.fix_pathinfo 设置为 0 以解决一个 Nginx + PHP CGI 可能存在的安全漏洞

CentOS: sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/opt/remi/php73/php.ini 
Debian: sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/php/8.2/fpm/php.ini 

配置完成后可以启动PHP并进行测试,新建一个以下内容的 index.php 文件放在Web目录下,内容为输出 PHP 信息:

<?php
    phpinfo();
?>

安装 Wordpress

WordPress 官网下载相应的版本到指定目录并解压好后切换到 WordPress 安装目录下,将 WordPress 目录的所有权授予 nginx 的用户,并将目录的读写权限改为 777:

chown -R nginx:nginx wordpress
chmod -R 777 wordpress

之后就可以打开域名根据提示安装使用 WordPress 了。

*如果使用 PHP 连接 MySQL 8 的时候,会发生以下错误:

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

是由于 MySQL 8 默认使用了新的密码验证插件:caching_sha2_password,而之前的PHP版本中所带的 mysqlnd 无法支持这种验证。解决这个问题,可以安装支持 caching_sha2_password 的PHP版本或者:

  1. 修改etc/my.cnf,添加以下内容:
[mysqld]
default_authentication_plugin= mysql_native_password

重启 MySQL systemctl restart mysqld

  1. 使用 root 账户登录 MySQL,运行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; 
FLUSH PRIVILEGES;

之后便可正常安装。