ubuntu手动搭建typecho博客(包括404解决、菜单高亮)以及 Nginx使用stream模块分流实现端口复用
一. ubuntu手动搭建typecho博客
Typecho是一个非常轻量化的开源博客程序,发展至今已经比较成熟,但是在部署时也会遇到一些问题。本文将根据Typecho的安装需求,从零开始部署一个完整的typecho博客。
Typecho需要的组件:
-
PHP5.1 以上
-
支持Mysql,PostgreSQL,SQLite 中的任意一种并在PHP中安装了相关扩展
-
CURL或Socket支持
-
mbstring或iconv扩展支持
1 PHP的安装
1.1 更新源
首先安装一个管理源的工具包
apt-get install software-properties-common
add-apt-repository ppa:ondrej/php
更新本地系统的源
apt-get update
1.2 安装 PHP7.4
安装PHP7.4,注意需要带上mbstring和mysql。
apt-get install php7.4 php7.4-fpm php7.4-mysql php7.4-gd php7.4-mbstring
安装完成后启动。
service php7.4-fpm start
PHP安装完成之后,并不能直接使用,因为PHP是一个处理页面的工具,并不能处理http请求。所以我们需要安装Nginx做代理。如果想要搭建支持https的博客,建议编译安装带ssl模块的nginx,安装方法可以参考这篇博客。
nginx安装完成以后,我们还需要连接PHP和Nginx,我们既可以通过socks连接,也可以通过端口连接。我自己尝试socks连接出了一些问题,大概于nginx的版本有关,这里有一些相关的讨论。稳妥起见,我们用端口连接PHP和Nginx。
1.3 配置PHP7.4
我们需要更改配置文件,让PHP以端口的方式连接nginx。
nano /etc/php/7.4/fpm/pool.d/www.conf
找到 listen 项,把/run/php/php7.4-fpm.sock 改为 127.0.0.1:9000,并保存文件。
重启PHP服务
service php7.4-fpm reload
此时可以通过 lsof -i:9000 命令查看9000端口的监听情况,如果输出以下信息,说明PHP的配置没有问题。
2 Mysql的安装
ubuntu下安装Mysql非常简单,只需要一行命令:
sudo apt install mysql-server
此时root用户密码为空,我们以root身份进入mysql修改密码,并创建一个用于typecho的数据库:
mysql
#进入mysql后更改root密码为mynewpassword
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'mynewpassword';
#创建一个名为typecho_blog的数据库
CREATE DATABASE typecho_blog;
#随后退出mysql
exit
之后要以root身份进入mysql,就需要使用 ‘mysql -u root -p’ 命令了。
3 typecho的部署
在某个你喜欢的地方新建一个目录,我们即将把typecho程序安装在这里(本文演示的目录为/home/typecho)。
#新建目录
mkdir -p /home/typecho
#进入目录
cd /home/typecho
#下载源码(可以在typecho官网找到)
wget https://github.com/typecho/typecho/releases/latest/download/typecho.zip
#解压源码
unzip typecho.zip
#对整个源码目录赋予足够的权限
chmod -R 777 /home/typecho
解压完成后,我们开始配置Nginx。
4 Nginx与PHP的连接、博客的安装
以下是Nginx与PHP连接的一个示例配置,完成配置之后,重启nginx并在浏览器访问你自己的域名。
server {
listen 80;
server_name abc.com;
root /home/typecho/;
index index.php;
location ~ .*\.php(\/.*)*$ {
root /home/typecho/;
fastcgi_split_path_info ^(.+?.php)(/.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
点击“下一步”
根据刚才的信息配置数据库
配置完成后,就可以进入博客了。
5 支持https的配置
要让博客支持https,必须满足以下条件:
-
你的域名有SSL证书
-
Nginx包含了ssl模块
首先,我们来到typecho的后台—设置,将站点地址的http改为https。
接下来,我们进入typecho的安装目录,编辑“config.inc.php”文件,加上这句代码:
define('__TYPECHO_SECURE__',true);
随后,我们也要相应地将nginx的配置文件改为支持ssl的,以下是一个配置文件的示例:
server {
listen 443 ssl;
server_name abc.com;
#注意ssl证书路径,替换成你自己的
ssl_certificate /home/ssl_cert/abc.com_bundle.pem;
ssl_certificate_key /home/ssl_cert/abc.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
root /home/typecho/;
index index.php;
location ~ .*\.php(\/.*)*$ {
root /home/typecho/;
fastcgi_split_path_info ^(.+?.php)(/.*)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
重启nginx后再次访问https的网站,可以发现已经变成了安全连接。
现在还有一个问题,如果直接访问域名的话,浏览器一般会默认访问http(80端口),要想强制访问443端口就需要在nginx中设置端口的重定向。这一部分本文就不再赘述,各位自行百度吧~
二. Typecho安装后后台界面和文章链接均为404错误的解决方法
我的博客:https://blog.itwk.cc
原因
这是由于Nginx对pathinfo支持不够的问题
需要手动添加地址重写代码。
解决办法
在站点配置文件,默认为/etc/nginx/sites-available/default中对应本Typecho的规则
将原有配置清除,添加如下代码:
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
然后重启Nginx:systemctl restart nginx | /etc/init.d/nginx.service restart
就可以打开后台控制面板和前台的文章链接了。
如果问题仍然存在,请检查fastcgi配置,以及PHP的cgi.fix_pathinfo问题,
以上代码同样适合宝塔面板,直接在伪静态中添加上面的代码即可,
三. 给typecho增加分类菜单导航和文章分类菜单高亮
typecho默认是不在菜单中显示栏目链接的,只显示页面的名称和链接,这一点对于我们可能不太适应,但我们可以header.php文件中,找到应对的位置,并增加如下代码,就可以显示栏目分类链接到菜单中了:
<?php $this->widget('Widget_Metas_Category_List')->to($category);?>
<?php while($category->next()):?>
<li class="nav-item <?php if($this->is('category',$category->slug)): ?>active<?php endif;?>">
<a class="nav-link" href="<?php $category->permalink();?>" title="<?php $category->name();?>"><?php $category->name();?></a>
</li>
<?php endwhile;?>
但是增加地栏目分类到菜单,你点开栏目下的文章,发现在阅读文章时,文章所属的栏目并没有高亮,此时使用下面的代码可实现栏目链接高亮:
<?php $this->widget('Widget_Metas_Category_List')->to($category);?>
<?php while ($category->next()):?>
<a <?php if($this->is('post')):?>
<?php if($this->category == $category->slug):?>class="current"<?php endif;?>
<?php else:?>
<?php if($this->is('category', $category->slug)):?>class="current"<?php endif;?>
<?php endif;?> href="<?php $category->permalink();?>"><?php $category->name();?>
</a>
<?php endwhile; ?>
本文由Program Say创作,采用CC BY 4.0协议许可。
四. Nginx使用stream模块分流实现端口复用
使用Nginx复用端口有很多方法,最普遍的方法是在不同的server块中监听同一端口,根据不同的主机名完成分流。本文介绍了一种较新的端口复用方法,它可以方便地对TLS加密的TCP数据进行分流。
1 Nginx stream分流
Nginx一般都工作在应用层,可以通过多个虚拟主机对端口的监听实现分流。其实,Nginx在1.0.9版本以后增加了stream模块,它利用SNI协议(TLS的扩展协议)对同一端口的不同主机转发流量,这一转发过程在传输层完成。
2 分流示例
下面展示了一个stream分流的实例,它根据不同的域名(capa.ink和crps.ink),将请求转发到不同的服务(web1和web2),实现了443端口的复用。
注意,请确保你的nginx中包含stream模块,否则请重新编译安装!
下面展示了stream块的配置方法(位于nginx.conf)。注意stream块与http块并列。
stream {
map $ssl_preread_server_name $stream_map {
capa.ink web1;
crps.ink web2;
}
upstream web1 {
server 127.0.0.1:8000;
}
upstream web2 {
server 127.0.0.1:8001;
}
#复用443端口
server {
listen 443 reuseport;
listen [::]:443 reuseport;
proxy_pass $stream_map;
ssl_preread on; #重点,一定要加这句
}
}
此时,nginx应该已经可以根据域名分别将请求分流到8000或8001端口了,我们在配置server块时即可直接监听这个端口。
以下代码展示了一个完整的基于php的网页的配置方案,它对应着上面配置中的"web1"服务,我们只需关心server块中前三行内容。由于该域名的请求已经由stream模块转向8000端口,所以在这里只需要监听8000端口即可。
server {
listen 8000 ssl http2;
server_name capa.ink;
port_in_redirect off;
ssl_certificate /document/mywebsite/certification/capa.ink_bundle.pem;
ssl_certificate_key /document/mywebsite/certification/capa.ink.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
root /document/mywebsite;
index index.php;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php$1 last;
}
location ~ .*\.php(\/.*)*$ {
root /document/mywebsite;
fastcgi_split_path_info ^(.+?.php)(/.*)$;
fastcgi_pass 127.0.0.1:9005;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
3 总结
在Nginx中,用stream块复用端口,与用server块复用端口的区别在于,stream块在传输层就完成了域名的传输,并完成分流;而server块在应用层才读取数据中包含的域名信息,再进行分流。stream可以在加密传输的情况下很方便地复用端口,如果要处理非加密的http协议,那么传统的server块完全能够胜任。
Typecho安装后后台界面和文章链接均为404错误的解决方法
原文地址:https://blog.csdn.net/weixin_54626591/article/details/134789608
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。