知识的荒漠

不积跬步无以至千里,不积小流无以成江海;千里之行,始于足下!

用户工具

站点工具


服务器:nas:lamp

安装Apache2

sudo apt install apache2 -y

浏览器输入服务器的IP地址或DNS名称,就可以看到Apache附带的默认网页
默认情况下所有Web内容都位于/var/www/html中
/var/www/html目录中的所有内容都需要由www-data用户和www-data组拥有,以便Apache Web Server能够读取文件

禁止列目录等相关配置

1.禁止列目录及配置允许重写覆盖
Options Indexes FollowSymLinks → Options -Indexes 禁止列目录
AllowOverride None → AllowOverride All 我们通常利用Apache的rewrite模块对URL进行重写,rewrite规则会写在.htaccess文件里.但要使apache能够正常的读取.htaccess文件的内容,就必须对.htaccess所在目录进行配置

sudo nano /etc/apache2/apache2.conf
#找到www相关并修改内容如下
<Directory /var/www/>
Options -Indexes
AllowOverride All
Require all granted
</Directory>

2.设置KeepAlive: KeepAlive On → KeepAlive Off
在内存非常充足的服务器上,不管是否关闭KeepAlive功能,服务器性能不会有明显变化;
如果服务器内存较少,或者服务器有非常大量的文件系统访问时,或者主要处理动态网页服务,关闭KeepAlive后可以节省很多内存,而节省出来的内存用于文件系统Cache,可以提高文件系统访问的性能,并且系统会更加稳定

开启rewrite,ssl,webdav模块

sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2enmod dav_fs
sudo a2enmod dav
sudo systemctl restart apache2

开启http2模块

注意:http2仅与https一起使用
ubuntu通过apt安装的apache2默认是mpm_prefork模式,想要切换到mpm_event模式,PHP支持库也要改变。

php -v #查看php版本,我这里是7.4
sudo a2dismod php7.4
sudo apt-get remove libapache2-mod-php7.4 #不知道php版本,也可以按tab自动补全,删除的时候会自动安装php7.4-fpm
sudo a2dismod mpm_prefork #关掉mpm_prefork
sudo apt-get install php7.4-fpm libapache2-mod-fcgid #安装fpm
sudo a2enmod proxy_fcgi #启用相关模块
sudo a2enconf php7.4-fpm #更新配置文件
sudo a2enmod mpm_event #启用mpm_event
sudo a2enmod http2
sudo nano /etc/apache2/sites-available/default-ssl.conf
#添加Protocols h2 http/1.1,意思是优先HTTP/2协议,否则就走HTTP/1.1
<IfModule mod_ssl.c>
<VirtualHost *:443>
Protocols h2 http/1.1
ServerAdmin webmaster@localhost
...
</VirtualHost>
</IfModule>
#也可通过将上句代码添加到/etc/apache2/apache2.conf来启用HTTP/2协议
sudo systemctl restart apache2

检测方法:浏览器插件插件推荐,或在线检测HTTP/2.0支持检测

设置session过期时间

打开/etc/php/7.4/apache2/php.ini(php-fpm模式下是/etc/php/7.4/fpm/php.ini),找到下面内容并修改值

session.gc_probability = 1 #默认0
session.gc_divisor = 1 #默认1000
session.gc_maxlifetime = 900 #默认1440,上面两个确保能回收session,这里设置时间900/60=15分钟
#保存后
sudo service php7.4-fpm restart #mpm_event模式要执行
sudo systemctl restart apache2
sudo chown -R www-data:www-data /var/lib/php/sessions/ #不把这个文件所有权给www-data,有些程序会报错

清理浏览器缓存,特别是cookie后测试

设置SSL

1.申请腾讯1年的免费ssl证书(自行百度)
2.下载并解压申请到的www.zjzj.xyz.zip文件,用winscp把Apache目录下的文件上传到/etc/apache2/ssl

sudo nano /etc/apache2/sites-available/default-ssl.conf
#注释掉自带的公钥pem和私钥key
#SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
#SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
#增加申请的证书
SSLCertificateFile /etc/apache2/ssl/2_www.zjzj.xyz.crt
SSLCertificateKeyFile /etc/apache2/ssl/3_www.zjzj.xyz.key
SSLCertificateChainFile /etc/apache2/ssl/1_root_bundle.crt
sudo a2ensite default-ssl #开启ssl站点
#上面命令是把sites-available目录下的default-ssl.conf软连接到sites-enabled目录下
sudo systemctl restart apache2 #重启apache2

配置虚拟主机(基于端口,采用81端口)

sudo chown -R www-data:www-data /var/www/html/tool/cloudreve/
sudo chmod -R 755 /var/www/html/tool/cloudreve/
sudo nano /etc/apache2/ports.conf
#在Listen 80下增加Listen 81
sudo nano /etc/apache2/sites-available/cloudreve.conf
#添加内容如下:
<VirtualHost *:81>
 ServerAdmin admin@example.com
 DocumentRoot /var/www/html/tool/cloudreve
 ServerName example.com
 <Directory /var/www/html/tool/cloudreve>
  Options Indexes FollowSymlinks
  AllowOverride All
  Require all granted
 </Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
#保存并退出,然后加载虚拟主机并重启apache2
sudo a2ensite cloudreve
sudo systemctl restart apache2

搞定,访问192.168.1.4:81,外网www.zjzj.xyz:84(路由映射84→81)

配置虚拟主机(基于域名,采用80端口)

路由器已配置好82→80的端口映射(家用宽带,80已封,万幸443没封)
因路由器已有frp.zjzj.xyz的二级域名解析,且针对*.frp.zjzj.xyz做了泛域名解析,所以本次使用yd.frp.zjzj.xyz

sudo nano /etc/apache2/sites-available/onedrive.conf
#添加内容如下:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/tool/olaindex/public
ServerName yd.frp.zjzj.xyz
<Directory /var/www/html/tool/olaindex/public>
Options Indexes FollowSymlinks
AllowOverride All
Require all granted
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
#保存并退出,然后加载虚拟主机并重启apache
sudo a2ensite onedrive
sudo systemctl restart apache2

搞定,外网访问http://yd.frp.zjzj.xyz:82(路由映射82→80)

前端nginx反代,后端apache

因为某些因素,通过访问公司路由器的nginx反向代理服务器(www.zjzj.xyz),转发到家里的apache服务器(https://zjzj.xyz:8443),默认apache记录的访问来源都是来自反向代理服务器,并不是真实的访问ip地址;要获取真实访问ip地址设置如下:
nginx前端
为了正确传递客户端的 ip 地址,反代节点的 Nginx 配置中需要增加以下内容:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

apache后端

sudo a2enmod remoteip #Apache获取真实IP地址有2个模块:mod_rpaf:Apache-2.2支持;Apache-2.4不支持;mod_remoteip:Apache-2.4自带模块;Apache-2.2 支持
sudo nano /etc/apache2/apache2.conf
#末尾添加
RemoteIPHeader X-Forwarded-For
#查看/etc/apache2/sites-available/default-ssl.conf中日志模式,默认情况下是combined格式,格式如:CustomLog ${APACHE_LOG_DIR}/access.log combined
#注释原combined并修改如下
#LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
#保存退出
sudo apache2ctl configtest #验证配置
sudo systemctl restart apache2

%a:the client ip address before the forwarder
%h:remote hostname/ip address

安装MySQL

或参考如何在 Ubuntu 20.04 上安装 MariaDB

sudo apt install mysql-server -y

安装完成后,运行以下命令以保护MySQL

sudo mysql_secure_installation
#根据提示信息输入y or n
...
Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No: N
#是否安装验证密码插件,通常回答N,因为我知道我的密码是安全的
New password:
Re-enter new password:
#输入两次密码
...
Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
#删除匿名用户,回答Y
...
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
#禁止远程root登录,回答Y
...
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
#删除测试数据库并访问它,回答Y
...
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
#重新加载权限表,回答Y,至此,mysql安装完毕

安装phpmyadmin

sudo apt-get install phpmyadmin

安装过程会有提示选择web服务器,选中apache2,回车,还会提示设置密码!phpmyadmin安装完后,并不在apache默认路径下,需要建立一个连接,终端:

sudo ln -s /usr/share/phpmyadmin /var/www/html
sudo /etc/init.d/apache2 restart

浏览器访问:http://localhost/phpmyadmin

mysql相关操作

在MySQL 8.0上,root 用户默认通过auth_socket插件授权。
auth_socket插件通过 Unix socket 文件来验证所有连接到localhost的用户。这意味着你不能通过提供密码,验证为 root。
如果你想以 root 身份登录 MySQL 服务器,使用其他的程序,例如 phpMyAdmin,你有两个选择。

sudo mysql
#方法一:将验证方法从auth_socket修改成mysql_native_password
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
#或者
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; #使用此命令成功
FLUSH PRIVILEGES;
#方法二(推荐):创建一个新的独立管理用户,拥有所有数据库的访问权限
GRANT ALL PRIVILEGES ON *.* TO 'administrator'@'localhost' IDENTIFIED BY '你的密码';

18.04及以下版本:
如上面操作中禁止远程root登录,回答Y,那么mysql只允许本机(localhost, 127.0.0.1)来连接访问

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
#注释掉下面这句
#bind-address = 127.0.0.1
sudo mysql -u root -p
#输入root密码
use mysql;
update user set host = '%' where user = 'root';
select host, user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| localhost | debian-sys-maint |
| localhost | mysql.session    |
| localhost | mysql.sys        |
+-----------+------------------+
4 rows in set (0.00 sec)
quit;
sudo service mysql restart
#或参考下面
grant all privileges on *.* to root@'%' identified by '密码'; #%代表所有主机,也可以具体到你的主机ip地址
flush privileges; #从mysql数据库的grant表中重新加载权限数据
quit; #退出mysql

其他基本命令

show databases; #显示所有数据库,刚安装好系统数据库有information_schema;mysql;performance_schema;sys
create database <数据库名>;
drop database <数据库名>;
use <数据库名>; #打开数据库
create table <表名> ( <字段名1> <类型1> [,..<字段名n> <类型n>]); #创建数据表
desc <表名>; #查看表结构
insert into <表名> [( <字段名1>[,..<字段名n > ])] values (1 )[, (值n )]; #插入数据
select <字段1,字段2,...> from <表名> where <表达式>; #查询数据
drop table <表名>; #删除表
mysqldump -u 用户名 –p 数据库名 > 导出的文件名; #导出数据库mysqldump –u root –p mydatabase > mydatabase_out.sql;

安装php

sudo apt install php -y
php --version #查看php版本
sudo nano /var/www/html/index.php
#输入以下内容
<?php
phpinfo();
?>
#至此,访问http://服务器ip地址/index.php即可看到php信息页面

安装phpcomposer

Composer是PHP的一个依赖管理工具;受到了node's npm和ruby's bundler的强烈启发;功能上类似于Java 的 Maven,Python 的 pip,Ruby的 gem,Nodejs 的 npm

cd /usr/local/bin #进入安装目录
sudo curl -s https://getcomposer.org/installer | sudo php #下载并安装
sudo chmod a+x composer.phar #添加执行权限
sudo mv composer.phar /usr/local/bin/composer #加入全局命令
composer --version #查看版本号
sudo composer install #通过composer安装PHP依赖项,注意:到源码目录在执行

安装PHP模块

sudo apt install php-c(按键盘tab键列出所有以c为开头的模块,补全后安装即可)

另一种方法使用pecl安装
PECL 的全称是 The PHP Extension Community Library ,是一个开放的并通过 PEAR(PHP Extension and Application Repository,PHP 扩展和应用仓库)打包格式来打包安装的 PHP 扩展库仓库。通过 PEAR 的 Package Manager 的安装管理方式,可以对 PECL 模块进行下载和安装。
例如安装mcrypt PHP扩展

sudo pecl channel-update pecl.php.net
sudo pecl install mcrypt-1.0.1
#询问时,只需按Enter键即可继续。
#接下来,使用以下命令将扩展名mcrypt.so添加到php.ini文件中:
sudo sed -i.bak '927iextension=mcrypt.so' /etc/php/7.2/cli/php.ini
#接下来,获取安装路径并添加到cli和apache2 php.ini配置中。
sudo bash -c "echo extension=/usr/lib/php/20170718/mcrypt.so > /etc/php/7.2/cli/conf.d/mcrypt.ini"
sudo bash -c "echo extension=/usr/lib/php/20170718/mcrypt.so > /etc/php/7.2/apache2/conf.d/mcrypt.ini"
#接下来,使用以下命令验证PHP mcrypt扩展:
sudo php -i | grep "mcrypt"
#输出:
mcrypt
mcrypt support => enabled
mcrypt_filter support => enabled
mcrypt.algorithms_dir => no value => no value
mcrypt.modes_dir => no value => no value

安装NodeJS

sudo apt install nodejs -y
node -v #查看版本,完整命令是nodejs --version

安装NPM

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题(注意:新版npm也可管理前端了)
使用npm管理项目,一般工程目录下会有一个名为package.json的json格式文件,该文件定义了工程的名称、作者、仓库地址、开发时依赖的模块,该工程的使用版本等等
注意:到源码目录在执行npm install

sudo apt install npm -y
npm -v #查看版本
npm ls #查看安装的模块
sudo npm uninstall <模块名> #卸载模块
#npm包安装亦难删亦难,用系统的删除,没个10分8分钟还删不完成,可以全局安装一个rimraf模块,可以快速删除node_modules目录下的所有文件及文件夹
sudo npm install rimraf -g #先安装删除工具
sudo rimraf node_modules #进入所需删除的node_modules文件夹的位置,再输入指令
#简单粗暴得秒删完成
前端工具bower,glup,grunt

bower:可用于搜索、安装和卸载如javascript、HTML、CSS之类的网络资源
glup:前端自动化构建工具;她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成;使用她,我们不仅可以很愉快的编写代码,而且大大提高我们的工作效率。
grunt:前端自动化构建工具,一个基于nodeJs的命令行工具,一般用于:压缩文件,合并文件,简单语法检查

sudo npm install -g gulp bower grunt-cli
sudo npm install #在安装相应前端工具后,在执行
bower -v
gulp -v
grunt -v

安装Yarn

是用来替代npm一个包管理工具,3个优点:安装速度快(服务器速度快,并且是并行下载),版本锁定,缓存机制;npm与yarn选1个安装即可,尽可能避免混用产生冲突。
npm与yarn语法对比如下:

npm init                            ---- yarn init
npm install                         ---- yarn
npm install xxx@1.1.1 -g            ---- yarn global add xxx@1.1.1
npm install xxx@1.1.1 --save        ---- yarn add xxx@1.1.1
npm install xxx@1.1.1 --save-dev    ---- yarn add xxx@1.1.1 --dev
npm uninstall xxx --save(-dev)      ----yarn remove xxx
npm run xxx                         ---- yarn run xxxx

Yarn 是一个 JavaScript 包管理器,它兼容于 npm,可以帮助你自动处理安装,升级,配置,和移除 npm 包。它被创建,用于解决 npm 的一系列问题,例如通过并行操作提高软件包安装处理速度并且减少网络连接相关的错误。

#导入软件源的 GPG key 并且添加 Yarn APT 软件源到你的系统,运行下面的命令:
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update
sudo apt install yarn
#上面的命令同时会安装 Node.js。如果你已经通过 nvm 安装了 Node,跳过 Node.js 安装过程:
sudo apt install --no-install-recommends yarn
yarn --version
yarn add [package_name] #添加依赖
yarn upgrade [package_name] #如果没有给出软件包,这个命令会根据package.json指定的版本范围,将项目依赖包全部升级到它们的最新版本。否则,仅仅升级指定的软件包。
yarn remove [package_name] #移除依赖
yarn install #安装package.json文件中指定的所有项目依赖

参考:https://www.itcoder.tech/posts/how-to-install-yarn-on-ubuntu-20-04/

python

python --version
python #进入python环境
exit() #退出
sudo apt-get install python-pip #安装Python包管理工具pip
pip --version
服务器/nas/lamp.txt · 最后更改: 2020/09/25 19:52 由 caiweizhi