月度归档:2025年11月

ubuntu25.04安装cups添加隔空打印

1. 更新系统并安装 CUPS 和打印机驱动

sudo apt update

sudo apt install cups cups-client cups-filters hplip printer-driver-gutenprint printer-driver-brlaser printer-driver-c2esp avahi-daemon avahi-discover libnss-mdns -y

# 上面选择自己的打印机,去掉不需要的

2. 将当前用户加入 lpadmin 组(方便以后管理打印机)

sudo usermod -aG lpadmin $USER # 重新登录或重启后生效

3. 启动并启用 CUPS 服务

sudo systemctl enable cups
sudo systemctl restart cups

4. 允许局域网访问 CUPS Web 管理界面和打印服务(关键步骤)

默认情况下 CUPS 只监听 127.0.0.1,我们要改成监听所有接口,并允许 192.168.9.0 网段访问。

编辑主配置文件:

sudo vim /etc/cups/cupsd.conf

# 只监听所有网络接口(而不是默认只听 localhost)
Listen localhost:631 ← 删除或注释掉这行
Port 631 ← 改成这一行,让它监听所有接口的 631 端口

# 允许局域网访问 Web 界面和打印服务

# 只监听所有网络接口(而不是默认只听 localhost)
Listen localhost:631          ← 删除或注释掉这行
Port 631                      ← 改成这一行,让它监听所有接口的 631 端口

# 允许局域网访问 Web 界面和打印服务
<Location />
  Order allow,deny
  Allow from 127.0.0.1
  Allow from 192.168.9.0/24   # 允许整个 9 网段
</Location>

<Location /admin>
  Order allow,deny
  Allow from 127.0.0.1
  Allow from 192.168.9.0/24   # 允许网段内访问管理页面(也可以只给自己IP)
  # Allow from 192.168.9.100   # 如果只想自己管理,可以写死自己的IP
</Location>

<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
  Order allow,deny
  Allow from 127.0.0.1
  Allow from 192.168.9.0/24
</Location>

保存后重启 CUPS:

sudo systemctl restart cups

7. 确保打印机被共享(命令行也可以强制共享)//一般不需要

如果你已经通过 Web 加好了,通常会自动共享。如果想用命令行确认或强制共享:

# 查看已安装的打印机名称
lpstat -p

# 强制开启共享(把 PrinterName 换成你的打印机名字)
sudo lpadmin -p PrinterName -o printer-is-shared=true

电脑添加网络打印机时,https://192.168.9.223:631/printers/Brother_HL-2140_series

Docker Compose一键部署LNMP环境全攻略

一、架构设计与服务规划

二、项目结构准备

lnmp-docker/
├── docker-compose.yml
├── nginx/
│   ├── conf.d/
│   │   └── app.conf
│   └── nginx.conf
├── php/
│   └── Dockerfile
├── mysql/
│   └── my.cnf
├── html/
│   └── index.php
└── .env

三、核心配置文件

3.1 docker-compose.yml

ersion: '3.8'

services:
  # Web服务
  nginx:
    image: nginx:1.25-alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./html:/var/www/html
      - ./ssl:/etc/nginx/ssl
    depends_on:
      php:
        condition: service_healthy
    networks:
      - lnmp-net

  # PHP处理
  php:
    build: ./php
    volumes:
      - ./html:/var/www/html
    environment:
      - TZ=Asia/Shanghai
    healthcheck:
      test: ["CMD", "php-fpm", "-t"]
      interval: 10s
      timeout: 5s
      retries: 3
    networks:
      - lnmp-net

  # 数据库
  mysql:
    image: mysql:8.0-debian
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASSWORD}
    networks:
      - lnmp-net

  # 数据库管理
  phpmyadmin:
    image: phpmyadmin:5.2
    ports:
      - "8080:80"
    environment:
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=${DB_ROOT_PASSWORD}
    depends_on:
      - mysql
    networks:
      - lnmp-net

volumes:
  mysql_data:

networks:
  lnmp-net:
    driver: bridge

3.2 PHP Dockerfile

FROM php:8.2-fpm-alpine

# 安装扩展
RUN apk add --no-cache \
    freetype-dev \
    libjpeg-turbo-dev \
    libpng-dev \
    libzip-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd pdo_mysql mysqli zip opcache

# 生产环境优化
RUN { \
    echo 'opcache.enable=1'; \
    echo 'opcache.memory_consumption=128'; \
    echo 'opcache.max_accelerated_files=10000'; \
    echo 'opcache.revalidate_freq=60'; \
} > /usr/local/etc/php/conf.d/opcache.ini

WORKDIR /var/www/html

3.3 Nginx app.conf配置

# nginx/conf.d/app.conf
server {
    listen 80;
    server_name localhost;
    
    root /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

3.4 Nginx nginx.conf配置

user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}

四、环境变量配置(.env)

# 数据库配置
DB_ROOT_PASSWORD=SuperSecretRootPass!
DB_NAME=app_prod
DB_USER=app_user
DB_PASSWORD=UserStrongPass123

# 时区配置
TZ=Asia/Shanghai

五、部署与验证

5.1 启动命令

# 构建并启动服务
docker compose up -d --build

# 查看服务状态
docker compose ps

# 查看实时日志
docker compose logs -f

5.2 环境验证

<?php
// html/index.php
phpinfo();

// 测试数据库连接
try {
    $pdo = new PDO(
        'mysql:host=mysql;dbname='.getenv('DB_NAME'),
        getenv('DB_USER'),
        getenv('DB_PASSWORD')
    );
    echo "Database connection OK!";
} catch (Exception $e) {
    echo "Connection failed: " . $e->getMessage();
}

六、生产环境优化建议

1.SSL加密:在nginx配置中添加443端口SSL证书

2.资源限制:在compose文件中添加资源限制

deploy:
  resources:
    limits:
      cpus: '2'
      memory: 1G

3.日志切割:配置logrotate管理容器日志

4.备份策略:定时备份MySQL数据卷

docker compose exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > backup.sql

摘自:https://blog.csdn.net/u011570324/article/details/147523961

vim一键运行Python/C/C++/go

vim一键运行Python、C、C++、go、html

" 用<F5>运行
noremap <silent> <F5> :call CompileRun()<CR>
func! CompileRun()
    exec "w"
    let g:asyncrun_open = 10
    let g:asyncrun_bell = 1
    let l:filename = expand('%:t')          " 文件名,如 main.c
    let l:filepath = expand('%:p')          " 完整路径
    let l:filedir = expand('%:p:h')         " 文件目录
    let l:filenamenoext = expand('%:t:r')   " 无后缀文件名,如 main
    let l:exe = l:filedir . '/' . l:filenamenoext  " 可执行文件路径
    if &filetype == 'c'
        exec ":AsyncRun -mode=term -pos=bottom -rows=10 -focus=0 gcc -Wall -O2 \"" . l:filepath . "\" -o \"" . l:exe . "\" && \"" . l:exe . "\""
    elseif &filetype == 'cpp'
        exec ":AsyncRun -mode=term -pos=bottom -rows=10 -focus=0 g++ -Wall -O2 -std=c++13 \"" . l:filepath . "\" -o \"" . l:exe . "\" && \"" . l:exe . "\""
    elseif &filetype == 'python'
        exec ":AsyncRun -mode=term -pos=bottom -rows=10 -focus=0 python3 \"" . l:filepath . "\""
    ""elseif &filetype == 'html'
        " Linux 下使用 xdg-open,静默打开浏览器
        ""exec ":AsyncRun -mode=term -pos=hide firefox \"" . l:filepath . "\""
    elseif &filetype == 'html'
    if executable('xdg-open')
        exec ":AsyncRun -mode=term -pos=hide nohup xdg-open \"" . l:filepath . "\" > /dev/null 2>&1 &"
    else
        echo "xdg-open not found! Run: sudo apt install xdg-utils"
    endif
    elseif &filetype == 'go'
        exec ":AsyncRun -mode=term -pos=bottom -rows=10 -focus=0 go run \"" . l:filepath . "\""
    elseif &filetype == 'javascript'
        exec ":AsyncRun -mode=term -pos=bottom -rows=10 -focus=0 node \"" . l:filepath . "\""
    else
        echo "Unsupported filetype: " . &filetype
    endif
endfunc

提前安装 AsyncRun.vim 插件

可选:清理旧可执行文件(防止缓存) 在函数开头加:

silent! exec “!rm -f \”” . l:exe . “\””